Содержание

,

Логика - ArduBlock

Если переменная R, равна 1, (то) выполняем 1 действие.

long R = 1;

void setup() {

}

void loop() {
    if (R == 1) {
       Первое действие
    }

}



Если переменная R, не равна 1, то (иначе) выполняем 2 действие.

long R = 1;

void setup() {

}

void loop() {
    if (R == 1) {
      Первое действие
    } else {
      Второе действие
    }

}



Нажать на кнопку pin 2 - включить светодиод pin 13 и отправить в монитор порта значение 1.

 void setup() {
  Serial.begin(9600);
  pinMode(2, INPUT_PULLUP);

}

void loop() {
    if (digitalRead(2) == 0) {
      pinMode(13, OUTPUT);
      digitalWrite(13, 1);
      Serial.println("1");
    } else {
      pinMode(13, OUTPUT);
      digitalWrite(13, 0);
      Serial.println("0");
    }

}



Если при повороте потенциометра pin A0 будет значение больше 500 то включаем светодиод pin 13, иначе отключаем.

void setup() {

}

void loop() {
    if (analogRead(A0) > 500) {
       pinMode(13, OUTPUT);
       digitalWrite(13, 1);
    } else {
       pinMode(13, OUTPUT);
       digitalWrite(13, 0);
    }

}



И первая pin 2 и вторая pin 3 кнопка должна быть нажата для включения светодиода pin 13.

void setup() {
  pinMode(2, INPUT_PULLUP);
  pinMode(3, INPUT_PULLUP);

}

void loop() {
    if (digitalRead(2) == 0 & digitalRead(3) == 0) {
       pinMode(13, OUTPUT);
       digitalWrite(13, 1);
    } else {
       pinMode(13, OUTPUT);
       digitalWrite(13, 0);
    }

} 



Или первая кнопка pin 2 или вторая pin 3 нажата для включения светодиода pin 13.

void setup() {
  pinMode(2, INPUT_PULLUP);
  pinMode(3, INPUT_PULLUP);

}

void loop() {
    if (digitalRead(2) == 0 | digitalRead(3) == 0) {
       pinMode(13, OUTPUT);
       digitalWrite(13, 1);
    } else {
       pinMode(13, OUTPUT);
       digitalWrite(13, 0);
    }

}



Кнопка pin 2 включает светодиод pin 12. Кнопка pin 3 включает светодиод pin 13.

void setup() {
  pinMode(2, INPUT_PULLUP);
  pinMode(3, INPUT_PULLUP);

}

void loop() {
    if (digitalRead(2) == 0) {
       pinMode(12, OUTPUT);
       digitalWrite(12, 1);
    } else if (digitalRead(3) == 0) {
       pinMode(13, OUTPUT);
       digitalWrite(13, 1);
    } else {
        pinMode(13, OUTPUT);
        digitalWrite(13, 0);
        pinMode(12, OUTPUT);
        digitalWrite(12, 0);
    }

} 



При нажатии на кнопку pin 2 значение блока 0 то через блок инверсия значение будет 1.

 void setup() {
  pinMode(2, INPUT_PULLUP);

}

void loop() {
    if (!digitalRead(2)) {
       pinMode(13, OUTPUT);
       digitalWrite(13, 1);
    } else {
       pinMode(13, OUTPUT);
       digitalWrite(13, 0);
    }

} 



При нажатии на кнопку pin 2 если значение будет истеным то включим светодиод pin 13.

void setup() {
  pinMode(2, INPUT_PULLUP);

}

void loop() {
    if (!digitalRead(2) == true) {
      pinMode(13, OUTPUT);
       digitalWrite(13, 1);
    } else {
      pinMode(13, OUTPUT);
       digitalWrite(13, 0);
    }

} 

,

Циклы - ArduBlock

После нажатия на кнопку pin 2, светодиод pin 13 включиться на 1 сек. и отключится на 1сек. и так 10 раз.

 void setup() {
  pinMode(2, INPUT_PULLUP);

}

void loop() {
    if (digitalRead(2) == 0) {
      for (int count = 0; count < 10; count++) {
         pinMode(13, OUTPUT);
         digitalWrite(13, 1);
              delay(1000);
         pinMode(13, OUTPUT);
         digitalWrite(13, 0);
              delay(1000);
      }
    }

} 



При нажатии на кнопку pin 2 запустится счётчик и в монитор порта отправятся числа от 1 до 10 с задержкой 1 сек.

void setup() {
 pinMode(2, INPUT_PULLUP);

}

void loop() {
    if (digitalRead(2) == 0) {
      for (int count = 0; count < 10; count++) {
         pinMode(13, OUTPUT);
         digitalWrite(13, 1);
              delay(1000);
         pinMode(13, OUTPUT);
         digitalWrite(13, 0);
              delay(1000);
      }
    }

}



При нажатии на кнопку pin 2 запустится счётчик и в монитор порта отправятся числа от 10 до 1 с задержкой 1 сек.

int x = 0;

void setup() {
  Serial.begin(9600);
  pinMode(2, INPUT_PULLUP);

}

void loop() {
    if (digitalRead(2) == 0) {
      for (int x=10; x>=1; x=x-1) {
        Serial.println(x);
        delay(1000);
      }
    }

} 



При нажатии на кнопку pin 2 к переменной присвоим значение 1 и выполним цикл.

int x = 0;

void setup() {
  Serial.begin(9600);
  pinMode(2, INPUT_PULLUP);

}

void loop() {
    if (digitalRead(2) == 0) {
      Serial.println("Нажали на кнопку и записали значение 1");
      x = 1;
    }
    while (x == 1){
      Serial.println("Мы в цикле если переменная равна 1");
      delay(1000);
      Serial.println("Меняем значение переменной на 0");
      x = 0;
      Serial.println("Выходим из цикла ");
    }

} 



Запускаем счётчик от 1 до 10 и когда значение будет равно 5 то выходим из цикла.

int x = 0;

void setup() {
  Serial.begin(9600);

}

void loop() {
    for (int x=1; x<=10; x=x+1) {
      Serial.println(x);
      delay(1000);
      if (x == 5) {
        Serial.println("Выходим из цикла");
        break;
         }
    }

} 



Блок счётчик - прибавляет к переменной значение 1.

int x = 0;

void setup() {
  Serial.begin(9600);

}

void loop() {
    Serial.println(x);
     x++ ;
     delay(1000);

} 

,

Математика - ArduBlock

Каждую секунду, бесконечно будем к переменной Х прибавлять значение 1, результат отправим в монитор порта.

int x = 0;

void setup() {
  Serial.begin(9600);

}

void loop() {
    x = x + 1;
    Serial.println(x);
    delay(1000);

}



Каждую секунду к переменной Х присвоим случайное число от 0 до 100 и результат отправим в монитор порта.

int x = 0;

void setup() {
  Serial.begin(9600);

}

void loop() {
    x = random(0,100);
    Serial.println(x);
    delay(1000);

} 



Получаем значение от 0 до 1023 с аналогового пина А0 и преобразуем от 0 до 255, отправляем на PWM pin 3.

int x = 0;

void setup() {
  Serial.begin(9600);
  pinMode(3, OUTPUT);

}

void loop() {
    x = analogRead(A0);
    x = map(x, 0, 1023, 0, 255);
     analogWrite(3, x);
    Serial.println((String(analogRead(A0)) + String(" - ") + String(x)));

} 



Является ли переменная Y чётным или нет в зависимости от этого в переменную X запишится значение 0 или 1.

int x = 0;
int y = 0;

void setup() {
  Serial.begin(9600);

}

void loop() {
    y = 125;
    x = (y % 2 == 0);
    Serial.println(x);

} 

,

Текст - ArduBlock

К переменной Text типа String присвоим текст в двойных кавычках и отправим в монитор порта.

String Text = "123";

void setup() {
  Serial.begin(9600);

}

void loop() {
    Text = "ArduBlock";
    Serial.println(Text);

} 



К переменной char присвоим символ в одинарных кавычках и отправим в монитор порта.

char Text = 'A';

void setup() {
  Serial.begin(9600);

}

void loop() {
    Text = 'B';
    Serial.println(Text);

} 



Текст + Переменная + Текст в строку, отправим результат в монитор порта.

float T = 0;

void setup() {
  Serial.begin(9600);

}

void loop() {
    T = 31.65;
    Serial.println((String("Температура - ") + String(T) + String(" °C")));

} 



В переменную запишем - Текст + Переменная + Текст, отправим результат в монитор порта.

float Temp = 0;
String Text = " ";

void setup() {
  Serial.begin(9600);

}

void loop() {
    Temp = 31.65;
    Text = String("Температура - ") + String(Temp) + String(" °C");
    Serial.println(Text);

} 

,

Время - ArduBlock

Задержка - останавливает все процессы в программе. Вкл pin 13, ожидание 1 сек, Откл pin 13, ожидание 1 сек.

void setup() {

}

void loop() {
    pinMode(13, OUTPUT);
    digitalWrite(13, 1);
      delay(1000);
    pinMode(13, OUTPUT);
    digitalWrite(13, 0);
      delay(1000);

} 



Задержка от дребезга кнопки pin 2.

int x = 0;

void setup() {
  Serial.begin(9600);
  pinMode(2, INPUT_PULLUP);

}

void loop() {
    if (digitalRead(2) == 0) {
      x = x + 1;
      Serial.println(x);
      delay(300);
    }

} 



Мигаем светодиодом pin 13 без задержки и влюбое время отправляем данные с кнопки pin 2 в монитор порта.

long temps1=0 ;
long temps2=0 ;

void setup() {
  Serial.begin(9600);
  pinMode(2, INPUT_PULLUP);

}

void loop() {
    if ((millis()-temps1)>=1*1000) {
      temps1=millis();
        pinMode(13, OUTPUT);
        digitalWrite(13, 1);
    }
    if ((millis()-temps2)>=2*1000) {
      temps2=millis();
        pinMode(13, OUTPUT);
        digitalWrite(13, 0);
    }
    if (digitalRead(2) == 0) {
        Serial.println("Кнопка нажата");
    }

} 



Мигающий светодиод pin 13 без задержки, при нажатии на кнопку pin 2 включается светодиод pin 12.

long temps1=0 ;
long temps2=0 ;

void setup() {
  pinMode(2, INPUT_PULLUP);

}

void loop() {
    if ((millis()-temps1)>=1*1000) {
      temps1=millis();
       pinMode(13, OUTPUT);
       digitalWrite(13, 1);
    }
    if ((millis()-temps2)>=2*1000) {
      temps2=millis();
       pinMode(13, OUTPUT);
       digitalWrite(13, 0);
    }
    if (digitalRead(2) == 0) {
       pinMode(12, OUTPUT);
       digitalWrite(12, 1);
    } else {
       pinMode(12, OUTPUT);
       digitalWrite(12, 0);
    }

} 

,

Основные блоки - ArduBlock

Блоки кода для разработчиков. Подключайте библиотеки, объявляйте переменные и т.д.

#include <SoftwareSerial.h>
int x = 25;
    // код 0

void setup() {
    // код 1
}

void loop() {
    // код 2
} 



Настройки - выполняются один раз после включения платы. Программа - выполняются бесконечно после настроек!

void setup() {
    // Выполняется один раз при включении платы
}

void loop() {
    // Программа выполняется в бесконечном цикле после настроек
} 



Мигаем светодиодом pin 13. Фоновый блок обходя задержку отправляет данные pin A0 в Монитор порта!

void yield (){
  Serial.println(analogRead(A0));
}

void setup() {
  Serial.begin(9600);
}

void loop() {
       pinMode(13, OUTPUT);
       digitalWrite(13, 1);
    delay(1000);
       pinMode(13, OUTPUT);
       digitalWrite(13, 0);
    delay(1000);
} 



При нажатии на кнопку pin 2 запускаем аппаратный сброс. Плата перезагружается.

void setup() {
    Serial.begin(9600);
    pinMode(2, INPUT_PULLUP);
    Serial.println("Плата запущена");

}

void loop() {
    if (digitalRead(2) == 0) {
         Serial.println("Нажата кнопка сброса");
         delay(300);
      void(* resetFunc) (void) = 0;
      resetFunc();   
    }
} 

,

Аппаратное прерывание - ArduBlock

Arduino платы поддерживающие аппаратное прерывание:

Arduino Pro Mini Pin 2 Pin 3        
Arduino Nano Pin 2 Pin 3        
Arduino Uno Pin 2 Pin 3        
Arduino Leonardo Pin 2 Pin 3 Pin 0 Pin 1 Pin 7  
Arduino Mega2560 Pin 2 Pin 3 Pin 21 Pin 20 Pin 19 Pin 18
ESP 8266 01 Pin 0          
ESP 8266 12 Pin 0 Pin 16        
ESP 32 Pin 2 Pin 12 Pin 13 Pin 15 Pin 27 Pin 32

- LOW вызывает прерывание, когда на порту LOW.
- CHANGE прерывание вызывается при смене значения на порту, с LOW на HIGH и наоборот.
- RISING прерывание вызывается только при смене значения на порту с LOW на HIGH.
- HIGH вызывает прерывание, когда на порту HIGH.
- FALLING прерывание вызывается только при смене значения на порту с HIGH на LOW.

Запрещается использовать блоки внутри функции аппаратного прерывания:

1. Не пытайтесь использовать блоки задержки.
2. Не пытайтесь производить вычисление чисел или переменных.
3. Не используйте вывод в Монитора порта.
4. Не пытайтесь читать данные с Монитора порта.




Мигающий светодиод на pin 13, 10 сек. включение и 1 сек. отключение.
При нажати на кнопку pin 2, резистором 2kOm подтянута к +5v, отключается светодиод.

void interrupt_2(){
   pinMode(13, OUTPUT);
   digitalWrite(13, 0);
}


void setup() {
  attachInterrupt(digitalPinToInterrupt(2),interrupt_2,LOW);
}

void loop() {
     pinMode(13, OUTPUT);
     digitalWrite(13, 1);
       delay(10000);
     pinMode(13, OUTPUT);
     digitalWrite(13, 0);
       delay(1000);

} 

,

Переменные - ArduBlock

Тип переменной long - Целое число - 4 байта - от -2 147 483 648 до 2 147 483 647

long x = 0;

void setup() {
  Serial.begin(9600);

}

void loop() {
    x = x + 1;
    Serial.println(x);
    delay(1000);

}



Тип переменной int - Целое число - 2 байта - от -32 768 до 32 767

int x = 0;

void setup() {
  Serial.begin(9600);

}

void loop() {
    x = x + 1;
    Serial.println(x);
    delay(1000);

}



Тип переменной char - 1 Символ ASCII - 1 байт

char x = 'A';

void setup() {
  Serial.begin(9600);

}

void loop() {
    x = 'B';
    Serial.println(x);
    delay(1000);

} 



Тип переменной String - Текст - 1 байт

String x = "ABC";

void setup() {
  Serial.begin(9600);

}

void loop() {
    x = "ArduBlock";
    Serial.println(x);
    delay(1000);

} 



Тип переменной boolean - Логическая переменная - 1 байт - 0 или 1, true или false

boolean x = true;

void setup() {
  Serial.begin(9600);

}

void loop() {
    x = false;
    Serial.println(x);
    delay(1000);

} 



Тип переменной byte - Целое число - 1 байт - от 0 до 255

byte x = 0;

void setup() {
  Serial.begin(9600);

}

void loop() {
    x = 255;
    Serial.println(x);
    delay(1000);

} 



Тип переменной float - Десятичное число - 4 байта - от -3.4028235E+38 до 3.4028235E+38

float x = 0;

void setup() {
  Serial.begin(9600);

}

void loop() {
    x = 3.14;
    Serial.println(x);
    delay(1000);

} 

,

Массивы - ArduBlock

Объявим массив R, состоящий из 3 переменных: R[0], R[1] и R[2].

int R [3] ={0,0,0};

void setup() {
  Serial.begin(9600);

}

void loop() {
    R[0]=1;
    R[1]=1;
    R[2]=1;
    Serial.println((String(R[0]) + String(" - ") + String(R[1]) + String(" - ") + String(R[2])));
    delay(1000);

} 

,

Функции - ArduBlock

Пример создания функции мигающего светодиода pin 13.

,

Цифровые и Аналоговые входы - ArduBlock

При нажати на кнопку pin 2, отправляется сообщение в монитор порта. (pin подтянут к GND через 2kOm резистор)

void setup() {
  Serial.begin(9600);
  pinMode(2, INPUT);

}

void loop() {
    if (digitalRead(2) == 1) {
        Serial.println("На цифровом пине значение 1");
    }

} 



При нажати на кнопку pin 2, отправляется сообщение в монитор порта.

void setup() {
  Serial.begin(9600);
  pinMode(2, INPUT_PULLUP);

}

void loop() {
    if (digitalRead(2) == 0) {
      Serial.println("Кнопка нажата");
    }

} 



При нажати на кнопку pin 2, отправляется сообщение в монитор порта.

 void setup() {
  Serial.begin(9600);
  pinMode(2, INPUT_PULLUP);

}

void loop() {
    if (!digitalRead(2) == 1) {
      Serial.println("Кнопка нажата");
    }

} 



Прочитаем данные с pin A0, и отправим их в монитор последовательного порта.

void setup() {
  Serial.begin(9600);

}

void loop() {
    Serial.println(analogRead(A0));
    delay(300);

} 



Если значение на pin A0 будет больше 500 то отправим сообщение в монитор порта.

void setup() {
  Serial.begin(9600);

}

void loop() {
    if (analogRead(A0) > 500) {
      Serial.println("Значение больше 500");
    }

} 

,

EEPROM - ArduBlock

Запишем в 0 ячейку памяти число 255 и прочитаем 0 ячейку памяти отправив значение в монитор порта.

#include <EEPROM.h>

void setup() {
    Serial.begin(9600);
    EEPROM.write(0,255);

}

void loop() {
    Serial.println((String("EEPROM - ") + String(EEPROM.read(0))));
    delay(1000);

} 



Запишем c 10 ячейки памяти текст ArduBlock и прочитаем c 10 ячейки памяти текст отправив в монитор порта.

#include <EEPROM.h>

String R = "ArduBlock";

void setup() {
    Serial.begin(9600);
    EEPROM.put(10,R);

}

void loop() {
    EEPROM.get(10,R);
    Serial.println((String("EEPROM - ") + String(R)));
    delay(1000);

} 

,

I2C Сканер

Подключите модуль по шине I2C! SDA - A4, SCL - A5

#include <Wire.h>

void setup() {
    Wire.begin(); Serial.begin(9600);
    while (!Serial);
    Serial.println(" I2C Scanner");
}

void loop() {
   byte error, address;
      int nDevices;
      nDevices = 0;
    for(address = 8; address < 127; address++ ){
      Wire.beginTransmission(address);
      error = Wire.endTransmission();
    if (error == 0){
    Serial.print("0x");
      if (address<16)
      Serial.print("0");
      Serial.println(address,HEX);
      nDevices++;
     }
    else if (error==4) {
    Serial.print("0x");
    if (address<16)
    Serial.print("0");
    Serial.println(address,HEX);
     }
    }
    if (nDevices == 0)
    Serial.println("No I2C");
    delay(1000);
}

Загрузите программу на плату Arduino.

Откройте монитор порта и выберите скорость - 9600.

Теоретическая часть. ArduBlock - Arduino Uno основы

Модуль реального времени DS1302

Схема подключение модуля DS1302:


DS1302 - Запись

В настройки установите блок DS1302 - запись.

#include <iarduino_RTC.h>

iarduino_RTC time(RTC_DS1302, 8,6,7);

void setup() {
  time.begin();
  time.settime(15,30,23,19,10,21, 1);
}

void loop() {

} 



1. Загрузите программу на плату Arduino.

2. Отключите блок.

3. Загрузите программу на плату Arduino с отключенным блоком записи.

#include <iarduino_RTC.h>

iarduino_RTC time(RTC_DS1302, 8,6,7);

void setup() {
  time.begin();
}

void loop() {

} 



DS1302 - Чтение

Отправим текстовое значение с модуля DS1302 в Монитор порта.

 void setup() {
  Serial.begin(9600);

}

void loop() {
    Serial.println((String(time.gettime("H")) + String(" - ") + String(time.gettime("i")) + String(" - ") + String(time.gettime("s"))));
    delay(1000);

} 



Отправим числовое значение с модуля DS1302 в Монитор порта.

String s = "ArduBlock";
int x = 0;

#include <iarduino_RTC.h>

iarduino_RTC time(RTC_DS1302, 8,6,7);


void setup() {
     Serial.begin(9600);
     time.begin();

}

void loop() {
    s = time.gettime("s");
    x = s.toInt();
    Serial.println(x);

} 

,

Модуль реального времени DS3231

Схема подключение модуля DS3231:


DS3231 - Запись

В настройки установите блок DS1302 - запись.

#include <RTClib.h>

RTC_DS3231 rtc;
DateTime t;
String daysOfTheWeek[7]={"Domingo","Lunes","Martes","Miercoles","Jueves","Viernes","Sabado"};
String monthsNames[12]={"Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre"};

void setup() {
  rtc.begin();
  rtc.adjust(DateTime(21,10,19,23,30,15));
}

void loop() {

} 



1. Загрузите программу на плату Arduino.

2. Отключите блок.

3. Загрузите программу на плату Arduino с отключенным блоком записи.

#include <RTClib.h>

RTC_DS3231 rtc;
DateTime t;
String daysOfTheWeek[7]={"Domingo","Lunes","Martes","Miercoles","Jueves","Viernes","Sabado"};
String monthsNames[12]={"Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre"};

void setup() {
  rtc.begin();
}

void loop() {

} 



DS3231 - Чтение

Отправим данные с модуля DS3231 в Монитор порта.

#include <RTClib.h>

RTC_DS3231 rtc;
DateTime t;
String daysOfTheWeek[7]={"Domingo","Lunes","Martes","Miercoles","Jueves","Viernes","Sabado"};
String monthsNames[12]={"Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre"};

void setup() {
  Serial.begin(9600);
  rtc.begin();

}

void loop() {
    t=rtc.now();
    Serial.println((String(t.hour()) + String("-") + String(t.minute()) + String("-") + String(t.second())));
    delay(1000);

} 

,

Модуль реального времени DS1307

Схема подключение модуля DS1307:


DS1307 - Запись

В настройки установите блок DS3231 = DS1307 - запись.

#include <RTClib.h>

RTC_DS3231 rtc;
DateTime t;
String daysOfTheWeek[7]={"Domingo","Lunes","Martes","Miercoles","Jueves","Viernes","Sabado"};
String monthsNames[12]={"Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre"};

void setup() {
  rtc.begin();
  rtc.adjust(DateTime(21,10,19,23,30,15));
}

void loop() {

} 



1. Загрузите программу на плату Arduino.

2. Отключите блок.

3. Загрузите программу на плату Arduino с отключенным блоком записи.

#include <RTClib.h>

RTC_DS3231 rtc;
DateTime t;
String daysOfTheWeek[7]={"Domingo","Lunes","Martes","Miercoles","Jueves","Viernes","Sabado"};
String monthsNames[12]={"Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre"};

void setup() {
  rtc.begin();
}

void loop() {

} 



DS1307 - Чтение

Отправим данные с модуля DS3231 = DS1307 в Монитор порта.

#include <RTClib.h>

RTC_DS3231 rtc;
DateTime t;
String daysOfTheWeek[7]={"Domingo","Lunes","Martes","Miercoles","Jueves","Viernes","Sabado"};
String monthsNames[12]={"Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre"};

void setup() {
  Serial.begin(9600);
  rtc.begin();

}

void loop() {
    t=rtc.now();
    Serial.println((String(t.hour()) + String("-") + String(t.minute()) + String("-") + String(t.second())));
    delay(1000);

} 

,

SoftSerial

При нажатии на кнопку, отправим число 2 по SoftSerial.
#include <SoftwareSerial.h>
long x = 0;
SoftwareSerial mySerial(2,3);

void setup() {
  mySerial.begin(9600);
  pinMode(4, INPUT_PULLUP);
}

void loop() {
    if (digitalRead(4) == 0) {
      x = 1;
      mySerial.write(x);
    } else {
      x = 0;
      mySerial.write(x);
    }

} 



По SoftSerial получаем число 1 и включаем светодиод.
#include <SoftwareSerial.h>
int x = 0;
SoftwareSerial mySerial(2,3);

void setup() {
  mySerial.begin(9600);
}

void loop() {
    if (mySerial.available() == 1) {
      x = mySerial.read();
      if (x == 1) {
        pinMode(13, OUTPUT);
         digitalWrite(13, 1);
      } else {
        pinMode(13, OUTPUT);
         digitalWrite(13, 0);
      }
    }

} 

,

Bluetooth

Пароль 0000 или 1234. Отправим значение по Bluetooth на телефон. Скачать приложение Bluetooth Controller.apk
#include <SoftwareSerial.h>
int x = 0;
SoftwareSerial mySerialBT(10,9);

void setup() {
  mySerialBT.begin(9600);
}

void loop() {
    x = x + 1;
    mySerialBT.println(x);
    delay(1000);
} 



Получаем данные с телефона. Если значение равно 1 то мы включим светодиод pin 13.
#include <SoftwareSerial.h>
char x = 'A';
SoftwareSerial mySerialBT(10,9);

void setup() {
  Serial.begin(9600);
  mySerialBT.begin(9600);
}

void loop() {
    if (mySerialBT.available() == 1) {
      x = mySerialBT.read();
      Serial.println(x);
      if (x == '1') {
        pinMode(13, OUTPUT);
         digitalWrite(13, 1);
      }
      if (x == '2') {
        pinMode(13, OUTPUT);
         digitalWrite(13, 0);
      }
    }
} 

,

IR Remote

Отправим коды кнопок пульта в сериал монитор порта.
#include <IRremote.h>
IRsend irsend;
long R = 0;
IRrecv ir_rx(2);
decode_results ir_rx_results;

unsigned long fnc_ir_rx_decode()
 {
  bool decoded=false;
  if( ir_rx.decode(&ir_rx_results))
  {
    decoded=true;
    ir_rx.resume();
  }
  if(decoded)
    return ir_rx_results.value;
  else
    return 0;
 }

void setup() {
  Serial.begin(9600);
  ir_rx.enableIRIn();
}

void loop() {
    R = (unsigned long)fnc_ir_rx_decode();
    if (R > 0) {
      Serial.println(R);
      if (R == 16753245) {
        pinMode(13, OUTPUT);
         digitalWrite(13, 1);
      }
      if (R == 16769565) {
        pinMode(13, OUTPUT);
         digitalWrite(13, 0);
      }
    }
} 

,

IR Led - IR Remote

IR Led Pin 3. При клике на кнопку отправляем число.
#include <IRremote.h>
IRsend irsend;

void setup() {
  pinMode(8, INPUT_PULLUP);
  pinMode(9, INPUT_PULLUP);
}

void loop() {
    if (digitalRead(8) == 0) {
      irsend.sendRC6(1,8);
      delay(500);
    }
    if (digitalRead(9) == 0) {
      irsend.sendRC6(2,8);
      delay(500);
    }
} 



IR Remote Pin 2. Принимаем значение и включаем светодиод.
#include <IRremote.h>
IRsend irsend;
long R = 0;

IRrecv ir_rx(2);
decode_results ir_rx_results;

unsigned long fnc_ir_rx_decode()
 {
  bool decoded=false;
  if( ir_rx.decode(&ir_rx_results))
  {
    decoded=true;
    ir_rx.resume();
  }
  if(decoded)
    return ir_rx_results.value;
  else
    return 0;
 }

void setup() {
  Serial.begin(9600);
  ir_rx.enableIRIn();
}

void loop() {
    R = (unsigned long)fnc_ir_rx_decode();
    if (R > 0) {
      Serial.println(R);
      if (R == 1) {
        pinMode(13, OUTPUT);
         digitalWrite(13, 1);
      }
      if (R == 2) {
        pinMode(13, OUTPUT);
         digitalWrite(13, 0);
      }
    }
} 

,

R433 Mhz

R433 Mhz - Передатчик Pin 2. Отправить значение число 70. (0 до 70)
 #include <VirtualWire.h>
 char msg[3] = { };
 const int transmit_pin = 2;
 int i = 0;

void setup() {
    vw_set_tx_pin(transmit_pin);
    vw_set_ptt_inverted(true);
    vw_setup(2000);
}

void loop() {
     vw_send((uint8_t *)msg, 70+1);
     vw_wait_tx();
     delay(1*1000);
} 



R433 Mhz - Передатчик Pin 2. При нажатии на кнопку Pin 3 отправляем число 1.
 #include <VirtualWire.h>
 char msg[3] = { };
 const int transmit_pin = 2;
 int i = 0;

void setup() {
    pinMode(3, INPUT_PULLUP);
    vw_set_tx_pin(transmit_pin);
    vw_set_ptt_inverted(true);
    vw_setup(2000);
}

void loop() {
    if (digitalRead(3) == 0) {
       vw_send((uint8_t *)msg, 1+1);
       vw_wait_tx();
    } else {
       vw_send((uint8_t *)msg, 0+1);
       vw_wait_tx();
    }
}



R433 Mhz - Приёмник Pin 2. Принимаем значение и отправляем в сериал монитор порта.
 #include <VirtualWire.h>
 const int receive_pin = 2;
 int ivins;
 long W = 0;

void setup() {
  Serial.begin(9600);
      vw_set_rx_pin(receive_pin);
      vw_set_ptt_inverted(true);
      vw_setup(2000);
      vw_rx_start();
}

void loop() {
      uint8_t buf[VW_MAX_MESSAGE_LEN];
      uint8_t buflen = VW_MAX_MESSAGE_LEN;
      if (vw_get_message(buf, &buflen))
     {
     for (ivins = 0; ivins < buflen-1; ivins++)
     {
      }
     }
      W = ivins;
      Serial.println(W);
} 



R433 Mhz - Приёмник Pin 2. Если приходит значение 1 то включаем светодиод Pin 13 иначе отключаем.
 #include <VirtualWire.h>
 const int receive_pin = 2;
 int ivins;
 int x = 0;

void setup() {
      vw_set_rx_pin(receive_pin);
      vw_set_ptt_inverted(true);
      vw_setup(2000);
      vw_rx_start();
}

void loop() {
      uint8_t buf[VW_MAX_MESSAGE_LEN];
      uint8_t buflen = VW_MAX_MESSAGE_LEN;
      if (vw_get_message(buf, &buflen))
     {
     for (ivins = 0; ivins < buflen-1; ivins++)
     {
      }
     }
      x = ivins;
    if (x == 1) {
       pinMode(13, OUTPUT);
       digitalWrite(13, 1);
    } else {
       pinMode(13, OUTPUT);
       digitalWrite(13, 0);
    }
} 

,

NRF 24L01

Отправляем данные с кнопки.
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(9,10);

int x = 0;

void setup() {
  radio.begin();
  radio.setChannel(100);
  radio.setDataRate (RF24_250KBPS);
  radio.setPALevel(RF24_PA_MIN);
  radio.openWritingPipe(0x0123456789LL);
  pinMode(2, INPUT_PULLUP);
}

void loop() {
     x = !digitalRead(2);
     radio.write(&x,sizeof(x));
} 



Принимаем данные и включаем светодиод.
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(9,10);

int x = 0;
 
void setup() {
  radio.begin();
  radio.setChannel(100);
  radio.setDataRate (RF24_250KBPS);
  radio.setPALevel(RF24_PA_MIN);
  radio.openWritingPipe(0x0123456789LL);
  radio.startListening();
}

void loop() {
     radio.read(&x,sizeof(x));
     pinMode(2, OUTPUT);
     digitalWrite(2, x);
} 



Отправляем массив.
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(9,10);
long R [2] ={0,0};

void setup() {
  radio.begin();
  radio.setChannel(100);
  radio.setDataRate (RF24_250KBPS);
  radio.setPALevel(RF24_PA_MIN);
  radio.openWritingPipe(0x0123456789LL);

  pinMode(2, INPUT_PULLUP);
}

void loop() {
    R[0]=(!digitalRead(2));
    R[1]=analogRead(A0);
     radio.write(&R,sizeof(R));
} 



Принимаем массив.
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(9,10);

long R [2] ={0,0};

void setup() {
  radio.begin();
  radio.setChannel(100);
  radio.setDataRate (RF24_250KBPS);
  radio.setPALevel(RF24_PA_MIN);
  radio.openWritingPipe(0x0123456789LL);
  radio.startListening();

  pinMode(3, OUTPUT);
}

void loop() {
     radio.read(&R,sizeof(R));
     pinMode(2, OUTPUT);
     digitalWrite(2, R[0]);
     R[1]=map(R[1], 0, 1023, 0, 255);
     analogWrite(3, R[1]);
     delay(10);
} 

,

Модуль GPS GY-NEO6MV2

Подключение модуля GPS GY-NEO6MV2 к плате Arduino. Чтение данных с модуля GPS.
#include <SoftwareSerial.h>
#include <TinyGPSPlus.h>

TinyGPSPlus gps;

SoftwareSerial mySoftwareSerialgps(2,3);

float flat,flon,falt,fc,fk,fmph,fmps,fkmph;
int year;
byte month, day, hour, minutes, second, hundredths,nsat;
unsigned long fix_age;

void setup() {
  Serial.begin(9600);
  mySoftwareSerialgps.begin(9600);
}

void loop() {
    while (mySoftwareSerialgps.available()>0)
     {
      if (gps.encode(mySoftwareSerialgps.read()))
       {
        if (gps.location.isValid())
        {
          flat= gps.location.lat();
          flon =gps.location.lng();
           }
        if (gps.altitude.isValid())
        {
          falt= gps.altitude.meters();
           }
        if (gps.course.isValid())
        {
          fc= gps.course.deg();
           }
        if (gps.satellites.isValid())
        {
          nsat=gps.satellites.value();
           }
        if (gps.speed.isValid())
        {
          fk=gps.speed.knots();
          fmph=gps.speed.mph();
          fmps= gps.speed.mps();
          fkmph =gps.speed.kmph();
           }
        if (gps.date.isValid())
        {
          year=gps.date.year();
          month=gps.date.month();
          day=gps.date.day();
           }
        if (gps.time.isValid())
        {
          hour=gps.time.hour();
          minutes=gps.time.minute();
          second=gps.time.second();
           }
       }
      }
    Serial.println((String(hour) + String(" : ") + String(minutes)));
    delay(1000);

} 

,

PS2 DualShock 2 - Arduino

При нажатии на кнопку включается а при нажатии на вторую отключается светодиод
#include <PS2X_lib.h>
PS2X ps2x;
int error = 0;
byte type = 0;
int vibrate = 0;

void setup() {
  error = ps2x.config_gamepad(13,11,10,12, true, true);
  type = ps2x.readType();
}

void loop() {
    ps2x.read_gamepad(false, vibrate);
     if(ps2x.Button(PSB_PAD_UP)) {
       pinMode(A0, OUTPUT);
       digitalWrite(A0, 1);

       }
     ps2x.read_gamepad(false, vibrate);
     if(ps2x.Button(PSB_PAD_DOWN)) {
       pinMode(A0, OUTPUT);
       digitalWrite(A0, 0);
       }
     delay(50);
} 



При нажатии на кнопку включается светодиод а при отпускании отключается
#include <PS2X_lib.h>
PS2X ps2x;
int error = 0;
byte type = 0;
int vibrate = 0;
int x = 0;

void setup() {
  error = ps2x.config_gamepad(13,11,10,12, true, true);
  type = ps2x.readType();
}

void loop() {
    ps2x.read_gamepad(false, vibrate);
     if(ps2x.Button(PSB_PAD_UP)) {
             x = 1;
       }
     if (x == 1) {
      pinMode(A0, OUTPUT);
       digitalWrite(A0, 1);
    } else {
      pinMode(A0, OUTPUT);
       digitalWrite(A0, 0);
    }
    ps2x.read_gamepad(false, vibrate);
     if(ps2x.Button(PSB_GREEN)) {
             x = 2;
       }
     if (x == 2) {
      pinMode(A1, OUTPUT);
       digitalWrite(A1, 1);
    } else {
      pinMode(A1, OUTPUT);
       digitalWrite(A1, 0);
    }
    x = 0;
    delay(50);
} 

,

Модуль SD карты

Подключение модуля SD карты к плате Arduino. Запись данных на SD карту
#include <SPI.h>
#include <SD.h>
int x = 0;
 
void sd_print(String file, String texttoprint, boolean lf)
  {
   File sd_file;
    sd_file = SD.open(file, FILE_WRITE);
  if(sd_file){
    if(lf)sd_file.println(texttoprint);
    else sd_file.print(texttoprint);
    sd_file.close();
  }
}

void setup() {
  SD.begin(10);
}

void loop() {
    x = analogRead(A0);
    sd_print("NAME.TXT",(String("ArduBlock - ") + String(x)),true);
    delay(500);
} 



Чтение данных с SD карты.
#include <SPI.h>
#include <SD.h>

String values;

void setup() {
  Serial.begin(9600);
  SD.begin(10);
  File myFile = SD.open("123.txt");
    if (myFile)
  {
    byte h = 0;
    char text[] = {};
    while (myFile.available())
    {
     text[h] = myFile.read();
      h++;
    }
    values = text;
    myFile.close();
 }
}

void loop() {
    Serial.println(values);
    delay(1000);
} 

,

Ключ DS1990

Подключение Ключа DS1990 к плате Arduino. Запись данных на Ключ DS1990.
 #include <OneWire.h>
 #define pin 2
 OneWire ibutton (pin);
 byte addr[8];
 int writeByte(byte data){
  int data_bit;
 for(data_bit=0; data_bit<8; data_bit++){
  if (data & 1){
     digitalWrite(pin, LOW); pinMode(pin, OUTPUT);
     delayMicroseconds(60);
     pinMode(pin, INPUT); digitalWrite(pin, HIGH);
    delay(10);
   } else {
     digitalWrite(pin, LOW); pinMode(pin, OUTPUT);
      pinMode(pin, INPUT); digitalWrite(pin, HIGH);
      delay(10);
   }
   data = data >> 1;
 }
  return 0;
}

void setup() {
  Serial.begin(9600);
}

void loop() {
     if ( !ibutton.search(addr) ) {
     return;
     }
     ibutton.skip();
     ibutton.reset();
     ibutton.write(0x33);
         ibutton.skip();
         ibutton.reset();
         ibutton.write(0xD1);
         digitalWrite(pin, LOW);
         pinMode(pin, OUTPUT);
         delayMicroseconds(60);
         pinMode(pin, INPUT);
         digitalWrite(pin, HIGH);
         delay(10);
         byte newID[8] = {0x44, 0x0F, 0xC8, 0x0B, 0x00, 0x00, 0x00, 0x2C};
      newID[0] = 1;
      newID[1] = 1;
      newID[2] = 1;
      newID[3] = 1;
      newID[4] = 1;
      newID[5] = 1;
      newID[6] = 1;
      newID[7] = 1;
        Serial.println();
         ibutton.skip();
         ibutton.reset();
         ibutton.write(0xD5);
         for (byte x = 0; x<8; x++){
           writeByte(newID[x]);
           Serial.print("*");
         }
         ibutton.reset();
         ibutton.write(0xD1);
         digitalWrite(pin, LOW);
         pinMode(pin, OUTPUT);
         delayMicroseconds(10);
         pinMode(pin, INPUT);
         digitalWrite(pin, HIGH);
         delay(10);
     Serial.print(" ");
       ibutton.skip();ibutton.reset();ibutton.write(0x33);
     Serial.print("Code recorded:");
         for (byte x=0; x<8; x++){
           Serial.print(" ");
         Serial.print(ibutton.read());
        }
       Serial.println(" ok");
     delay(2000);
} 



Чтение данных с Ключа DS1990.
#include <OneWire.h>
int x = 0;
long NaN = 0;
#define pin 2
OneWire ibutton (pin);
byte addr[8];
int writeByte(byte data){
  int data_bit;
 for(data_bit=0; data_bit<8; data_bit++){
  if (data & 1){
     digitalWrite(pin, LOW); pinMode(pin, OUTPUT);
     delayMicroseconds(60);
     pinMode(pin, INPUT); digitalWrite(pin, HIGH);
    delay(10);
   } else {
     digitalWrite(pin, LOW); pinMode(pin, OUTPUT);
      pinMode(pin, INPUT); digitalWrite(pin, HIGH);
      delay(10);
   }
   data = data >> 1;
 }
  return 0;
}

void setup() {
  Serial.begin(9600);
}

void loop() {
    if ( !ibutton.search(addr) ) {
     return;
     }
     ibutton.skip();
     x = addr[0];
     NaN = addr[1];
     NaN = addr[2];
     NaN = addr[3];
     NaN = addr[4];
     NaN = addr[5];
     NaN = addr[6];
     NaN = addr[7];
    Serial.println(x);
    if (x == 1) {
      pinMode(13, OUTPUT);
       digitalWrite(13, 1);
      delay(3000);
      pinMode(13, OUTPUT);
       digitalWrite(13, 0);
      delay(100);
    }
} 

,

RFID MFRC522

Подключение RFID MFRC522 к плате Arduino. Получение данных с RFID карты.
#include <SPI.h>
#include <MFRC522.h>
MFRC522 mfrc522(10,9);
 String x = "ArduBlock";
 byte cardx[4]= {0x3F,0x01,0x23,0x44};
 String cardreaded(byte *buffer,byte bufferSize)
 {
 String card="";
 for (byte i=0; i<bufferSize; i++)
 {
 card+=String(buffer[i]<0x10 ? " 0" : " ");
 card+=String(buffer[i],HEX);
 }
 return card;
  }

void setup() {
  Serial.begin(9600);
  SPI.begin();
  mfrc522.PCD_Init();
}

void loop() {
     if (mfrc522.PICC_ReadCardSerial() == 1 | mfrc522.PICC_IsNewCardPresent() == 1) {
      x = cardreaded(mfrc522.uid.uidByte, mfrc522.uid.size);
      }
       Serial.println(x);
    if (x == " b0 43 8e 1a") {
      pinMode(2, OUTPUT);
       digitalWrite(2, 1);
      delay(1000);
      pinMode(2, OUTPUT);
       digitalWrite(2, 0);
       void(* resetFunc) (void) = 0;
         resetFunc();
    }
} 

,

Сдвиговый регистр - 74HC595

2 - Две микросхемы! Если одна микросхема то укажите число 1. Включить 1 светодиод!
#include <Shift595.h>
#define   dataPin 10
#define   latchPin 9
#define   clockPin 8
#define   numOfRegisters 2
Shift595 Shifter(dataPin, latchPin, clockPin, numOfRegisters);

void setup() {
}

void loop() {
    Shifter.setRegisterPin(1, 1);
} 

,

Servo SG90

Подключение Servo SG90
#include <VarSpeedServo.h>

VarSpeedServo myServo4;


void setup() {
    myServo4.attach(4);

    myServo4.slowmove(0,255);
}

void loop() {
     myServo4.slowmove(90,255);
     delay(1000);
     
     myServo4.slowmove(90,10);
     delay(5000);
     
     myServo4.detach();
     delay(5000);
} 

,

Мотор шилд L298N

Управление Мотором A / Мотором В
void setup() {

}

void loop() {
     pinMode(12,OUTPUT);
     pinMode(10,OUTPUT);
     digitalWrite(12,1);
     analogWrite(10,255);
 
     pinMode(13,OUTPUT);
     pinMode(11,OUTPUT);
     digitalWrite(13,1);
     analogWrite(11,255);

} 

,

Драйвер моторов L298N

Управление Мотором A / Мотором В
void setup() {

}

void loop() {
     pinMode(5,OUTPUT);
     pinMode(6,OUTPUT);
     analogWrite(5,255);
     analogWrite(6,0);
     
     pinMode(9,OUTPUT);
     pinMode(10,OUTPUT);
     analogWrite(9,255);
     analogWrite(10,0);
} 

,

Драйвер моторов L298N

Управление Мотором A / Мотором В
void setup() {

}

void loop() {
     pinMode(5,OUTPUT);
     pinMode(6,OUTPUT);
     analogWrite(5,255);
     analogWrite(6,0);
     
     pinMode(9,OUTPUT);
     pinMode(10,OUTPUT);
     analogWrite(9,255);
     analogWrite(10,0);
} 

,

Униполярный шаговый мотор ULN2003

Управление униполярным шаговый мотором через ULN2003
#include <Stepper.h>

Stepper stepper_1(48,2,3,4,5);

void setup() {

}

void loop() {
     stepper_1.setSpeed(600);
     stepper_1.step(1000);
     
     stepper_1.setSpeed(600);
     stepper_1.step((-1000));
} 

,

Шаговый мотор A4988

Управление шаговый мотором через A4988
 long stepn23 = 0;
 long spedn23 = 0;


void setup() {
   pinMode(2, OUTPUT);
   pinMode(3, OUTPUT);
}

void loop() {
       stepn23 = 1000;
       spedn23 = 150;
       if (stepn23 < 0 && spedn23 > 0){
         stepn23 = stepn23*-1;
         for (int count = 0; count < stepn23; count++) {
           digitalWrite(2, 0);
           digitalWrite(3, 1);
           delayMicroseconds(map(spedn23, 100, 1, 4000, 10000));
           digitalWrite(3, 0);
           delayMicroseconds(map(spedn23, 100, 1, 4000, 10000));
         }
        stepn23 = stepn23*-1;
          }
       if (stepn23 > 0 && spedn23 > 0){
         for (int count = 0; count < stepn23; count++) {
           digitalWrite(2, 1);
           digitalWrite(3, 1);
           delayMicroseconds(map(spedn23, 100, 1, 4000, 10000));
           digitalWrite(3, 0);
           delayMicroseconds(map(spedn23, 100, 1, 4000, 10000));
         }
          }
       if (stepn23 == 0 | spedn23 == 0){
           digitalWrite(2, 0);
           digitalWrite(3, 0);
          }

       stepn23 = (-1000);
       spedn23 = 150;
       if (stepn23 < 0 && spedn23 > 0){
         stepn23 = stepn23*-1;
         for (int count = 0; count < stepn23; count++) {
           digitalWrite(2, 0);
           digitalWrite(3, 1);
           delayMicroseconds(map(spedn23, 100, 1, 4000, 10000));
           digitalWrite(3, 0);
           delayMicroseconds(map(spedn23, 100, 1, 4000, 10000));
         }
        stepn23 = stepn23*-1;
          }
       if (stepn23 > 0 && spedn23 > 0){
         for (int count = 0; count < stepn23; count++) {
           digitalWrite(2, 1);
           digitalWrite(3, 1);
           delayMicroseconds(map(spedn23, 100, 1, 4000, 10000));
           digitalWrite(3, 0);
           delayMicroseconds(map(spedn23, 100, 1, 4000, 10000));
         }
          }
       if (stepn23 == 0 | spedn23 == 0){
           digitalWrite(2, 0);
           digitalWrite(3, 0);
          }
} 

,

Бесколлекторный мотор

Управление бесколлекторным мотором
#include <VarSpeedServo.h>

VarSpeedServo myServo4;

void setup() {
  myServo4.attach(4);
  
  delay(2000);
  myServo4.slowmove(180,150);
  delay(2000);
  myServo4.slowmove(0,150);
  delay(5000);
}

void loop() {
     myServo4.slowmove(18,150);
      delay(5000);
     myServo4.slowmove(30,150);
      delay(5000);
     myServo4.slowmove(40,150);
      delay(5000);
        // Откл
     myServo4.slowmove(17,150);
      delay(5000);
} 

,

CNC Shield - A4988 TMC2209

Управление CNC Shield - A4988 TMC2209
 long stepn52 = 0;
 long spedn52 = 0;
 long stepn63 = 0;
 long spedn63 = 0;
 long stepn74 = 0;
 long spedn74 = 0;


void setup() {
   pinMode(5, OUTPUT);
   pinMode(2, OUTPUT);
   pinMode(6, OUTPUT);
   pinMode(3, OUTPUT);
   pinMode(7, OUTPUT);
   pinMode(4, OUTPUT);
}

void loop() {
     stepn52 = 1000;
     spedn52 = 150;
       if (stepn52 < 0 && spedn52 > 0){
         stepn52 = stepn52*-1;
         for (int count = 0; count < stepn52; count++) {
           digitalWrite(5, 0);
           digitalWrite(2, 1);
           delayMicroseconds(map(spedn52, 100, 1, 4000, 10000));
           digitalWrite(2, 0);
           delayMicroseconds(map(spedn52, 100, 1, 4000, 10000));
         }
        stepn52 = stepn52*-1;
          }
       if (stepn52 > 0 && spedn52 > 0){
         for (int count = 0; count < stepn52; count++) {
           digitalWrite(5, 1);
           digitalWrite(2, 1);
           delayMicroseconds(map(spedn52, 100, 1, 4000, 10000));
           digitalWrite(2, 0);
           delayMicroseconds(map(spedn52, 100, 1, 4000, 10000));
         }
          }
       if (stepn52 == 0 | spedn52 == 0){
           digitalWrite(5, 0);
           digitalWrite(2, 0);
          }

     stepn63 = 1000;
     spedn63 = 150;
       if (stepn63 < 0 && spedn63 > 0){
         stepn63 = stepn63*-1;
         for (int count = 0; count < stepn63; count++) {
           digitalWrite(6, 0);
           digitalWrite(3, 1);
           delayMicroseconds(map(spedn63, 100, 1, 4000, 10000));
           digitalWrite(3, 0);
           delayMicroseconds(map(spedn63, 100, 1, 4000, 10000));
         }
        stepn63 = stepn63*-1;
          }
       if (stepn63 > 0 && spedn63 > 0){
         for (int count = 0; count < stepn63; count++) {
           digitalWrite(6, 1);
           digitalWrite(3, 1);
           delayMicroseconds(map(spedn63, 100, 1, 4000, 10000));
           digitalWrite(3, 0);
           delayMicroseconds(map(spedn63, 100, 1, 4000, 10000));
         }
          }
       if (stepn63 == 0 | spedn63 == 0){
           digitalWrite(6, 0);
           digitalWrite(3, 0);
          }

     stepn74 = 1000;
     spedn74 = 150;
       if (stepn74 < 0 && spedn74 > 0){
         stepn74 = stepn74*-1;
         for (int count = 0; count < stepn74; count++) {
           digitalWrite(7, 0);
           digitalWrite(4, 1);
           delayMicroseconds(map(spedn74, 100, 1, 4000, 10000));
           digitalWrite(4, 0);
           delayMicroseconds(map(spedn74, 100, 1, 4000, 10000));
         }
        stepn74 = stepn74*-1;
          }
       if (stepn74 > 0 && spedn74 > 0){
         for (int count = 0; count < stepn74; count++) {
           digitalWrite(7, 1);
           digitalWrite(4, 1);
           delayMicroseconds(map(spedn74, 100, 1, 4000, 10000));
           digitalWrite(4, 0);
           delayMicroseconds(map(spedn74, 100, 1, 4000, 10000));
         }
          }
       if (stepn74 == 0 | spedn74 == 0){
           digitalWrite(7, 0);
           digitalWrite(4, 0);
          }
} 

,

Геймпад беспроводной PS2

Приём данных с PS2 uno
 #include <PS2X_lib.h>
 PS2X ps2x;
 int error = 0;
 byte type = 0;
 int vibrate = 0;
 int x = 0;

void setup() {
  Serial.begin(9600);
  pinMode(A0, OUTPUT);
  error = ps2x.config_gamepad(13,11,10,12, true, true);
  type = ps2x.readType();
}

void loop() {
     ps2x.read_gamepad(false, vibrate);
     if(ps2x.Button(PSB_PAD_UP)) {
     Serial.println("1");
     x = 1;
     }
     if (x == 1) {
     digitalWrite(A0, 1);
     } else {
     digitalWrite(A0, 0);
     }
     delay(50);
     x = 0;
} 

Теоретическая часть.модули вывода

Дальномер - HC SR04

Все полученные значения с дальномера HC SR04 отправим в монитор порта.
int x = 0;

long ultrason_11() {
   long duration, distance;
   digitalWrite(11,LOW);
   delayMicroseconds(2);
   digitalWrite(11, HIGH);
   delayMicroseconds(10);
   digitalWrite(11, LOW);
   duration = pulseIn(12, HIGH);
   distance = duration/58;
   return distance;
}


void setup() {
  Serial.begin(9600);
  pinMode(11, OUTPUT);
  pinMode(12, INPUT);

}

void loop() {
    x = ultrason_11();
    Serial.println(x);
    delay(300);

} 



Все полученные значения с дальномера HC SR04 отправим в монитор порта.
int x = 0;

long ultrason_10() {
   long duration, distance;
   digitalWrite(10,LOW);
   delayMicroseconds(2);
   digitalWrite(10, HIGH);
   delayMicroseconds(10);
   digitalWrite(10, LOW);
   duration = pulseIn(10, HIGH);
   distance = duration/58;
   return distance;
}


void setup() {
  Serial.begin(9600);
  pinMode(10, OUTPUT);
  pinMode(10, INPUT);

}

void loop() {
    x = ultrason_10();
    Serial.println(x);
    delay(300);

} 

,

Модули температуры и влажности

Модуль температуры и влажности DHT 11.
#include "DHT.h"

DHT dht_4(4,DHT11);

float T = 0;
float H = 0;

void setup() {
  Serial.begin(9600);
  dht_4.begin();
}

void loop() {
    T = dht_4.readTemperature();
    H = dht_4.readHumidity();
    Serial.println((String(" T - ") + String(T) + String(" H - ") + String(H)));
    delay(500);
} 



Модуль температуры и влажности DHT 22.
#include "DHT.h"

DHT dht_4(4,DHT22);

float T = 0;
float H = 0;

void setup() {
  Serial.begin(9600);
  dht_4.begin();
}

void loop() {
    T = dht_4.readTemperature();
    H = dht_4.readHumidity();
    Serial.println((String(" T - ") + String(T) + String(" H - ") + String(H)));
    delay(500);
} 



Модуль температуры и влажности AM 2120.
#include "DHT.h"

DHT dht_4(4,DHT22);

float T = 0;
float H = 0;

void setup() {
  Serial.begin(9600);
  dht_4.begin();
}

void loop() {
    T = dht_4.readTemperature();
    H = dht_4.readHumidity();
    Serial.println((String(" T - ") + String(T) + String(" H - ") + String(H)));
    delay(500);
} 

,

Термосенсор - DS18B20

Полученные значения с термосенсора DS18B20 и отправим в монитор порта.
#include <OneWire.h>
#include <DallasTemperature.h>
OneWire oneWireBus(4);
DallasTemperature sensors(&oneWireBus);

int x = 0;

void setup() {
  Serial.begin(9600);
  sensors.begin();
}

void loop() {
     sensors.requestTemperatures();
     x = sensors.getTempCByIndex(0);
    Serial.println(x);
    delay(300);
} 

,

Термосенсор - DS18B20

Полученные значения с 2x DS18B20 и отправим в монитор порта.
  #include <OneWire.h>
  #include <DallasTemperature.h>
  int T1[8] = {0x28, 0x4C, 0x83, 0x3D, 0x00, 0x00, 0x00, 0x46};
  int T2[8] = {0x28, 0xDB, 0xAC, 0x3C, 0x00, 0x00, 0x00, 0x6A};
  float s1 = 0;
  float s2 = 0;
  OneWire oneWireBus12(12);
  DallasTemperature sensors12(&oneWireBus12);
  OneWire oneWireBus2(2);
  DallasTemperature sensors2(&oneWireBus2);

void setup() {
    Serial.begin(9600);
    sensors12.begin();
    sensors2.begin();
}

void loop() {
    sensors12.requestTemperatures();
    s1 = sensors12.getTempCByIndex(T1);
    sensors2.requestTemperatures();
    s2 = sensors2.getTempCByIndex(T2);
    Serial.println((String("S1 - ") + String(s1) + String(" S2 - ") + String(s2)));
    delay(1000);
} 

,

Барометр - BMP

Все полученные значения с барометра BMP 180 отправим в монитор порта.
#include <iarduino_Pressure_BMP.h>
 iarduino_Pressure_BMP sensor(0x77);
 
 float x = 0;
 float t = 0;

 float bmppressure;
 float bmptemperature;
 float bmpaltitude;
 float bmppressure2;

void setup() {
  Serial.begin(9600);
  sensor.begin();
}

void loop() {
    if(sensor.read(1)){
        bmppressure = sensor.pressure;
        bmptemperature = sensor.temperature;
        bmpaltitude = sensor.altitude;
      }
          if(sensor.read(2)){
        bmppressure2 = sensor.pressure;
     x = bmppressure;
     }
    t = bmptemperature;
    Serial.println((String("D - ") + String(x) + String(" T - ") + String(t)));

} 

,

Бесконтактный термометр - GY-906

Получим данные с бесконтактного термометра GY-906 и отправим их в монитор порта.
#include <SparkFunMLX90614.h>

int x = 0;
IRTherm therm;

void setup() {
  Serial.begin(9600);
  therm.begin();
  therm.setUnit(TEMP_C);
}

void loop() {
    x = (therm.read() ? String(therm.object(), 2) : "").toInt();
    Serial.println(x);
    if (x > 30) {
       pinMode(13, OUTPUT);
       digitalWrite(13, 1);
    } else {
       pinMode(13, OUTPUT);
       digitalWrite(13, 0);
    }
    delay(300);
} 

,

Потенциометр 10kOm

Пример получения данных с аналового пина A0.

int x = 0;

void setup() {
  Serial.begin(9600);
  pinMode(3, OUTPUT);
}

void loop() {
    x = analogRead(A0);
    x = map(x, 0, 1023, 0, 255);
    Serial.println(x);
    analogWrite(3, x);
    delay(10);
} 

,

Инфракрасный дальномер - GP2Y0A21

Получим данные с инфракрасного дальномера GP2Y0A21.

int x = 0;

void setup() {
  Serial.begin(9600);
}

void loop() {
    x = analogRead(A0);
    Serial.println(x);
    if (x > 100) {
      pinMode(13, OUTPUT);
      digitalWrite(13, 1);
    } else {
      pinMode(13, OUTPUT);
      digitalWrite(13, 0);
    }
    delay(300);
} 

,

Матричная клавиатура 4х4 4х3

Получение данных с матричной клавиатуры 4х4 4х3.
#include <Keypad.h>
char x = 'A';
byte Pins_Rows[]={9,8,7,6};
byte Pins_Columns[]={5,4,3,2};
char keys[4][4]={{'1','2','3','A'},{'4','5','6','B'},{'7','8','9','C'},{'*','0','#','D'}};
Keypad Keyboard= Keypad(makeKeymap(keys),Pins_Rows,Pins_Columns,4,4);

void setup() {
  Serial.begin(9600);
}

void loop() {
    x = Keyboard.getKey();
    if (x > 0) {
      Serial.println(x);
      if (x == '1') {
        pinMode(13, OUTPUT);
         digitalWrite(13, 1);
      }
      if (x == '2') {
        pinMode(13, OUTPUT);
         digitalWrite(13, 0);
      }
    }
} 


,

DIY энкодер с кнопкой

Прочитаем данные с энкодера и кнопки
#include <Encoder.h>
Encoder encoder_1(4,5);

int x = 0;

void setup() {
  Serial.begin(9600);
  pinMode(6, OUTPUT);
  pinMode(3, INPUT_PULLUP);
}

void loop() {
    x = (encoder_1.read()/4);
    Serial.println(x);
    if (x < 0) {
      encoder_1.write((0 * 4));
    }
    if (x > 252) {
      encoder_1.write((252 * 4));
    }
    if (x >= 0 & x <= 252) {
       analogWrite(6, x);
    }
    if (!digitalRead(3)) {
      encoder_1.write((0 * 4));
    }
} 

,

Датчик тока - ACS712

Прочитаем заничение с датчика тока ACS712.
 #include <ACS712.h>
 ACS712 sensor(ACS712_30A, A0);
 float x = 0;

void setup() {
  Serial.begin(9600);
  sensor.calibrate();
}

void loop() {
    x = sensor.getCurrentDC();
    Serial.println(x);
    delay(300);
} 


,

Акселерометр - ADXL345

Прочитаем значение с Акселерометра ADXL345
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_ADXL345_U.h>
Adafruit_ADXL345_Unified accel = Adafruit_ADXL345_Unified(12345);
sensors_event_t event;
int x = 0;
int y = 0;
int z = 0;

void setup() {
  Serial.begin(9600);
  accel.begin();
  accel.setRange(ADXL345_RANGE_16_G);
}

void loop() {
    accel.getEvent(&event);
      x = event.acceleration.x;
    accel.getEvent(&event);
      y = event.acceleration.y;
    accel.getEvent(&event);
      z = event.acceleration.z;
    Serial.println((String(x) + String(" - ") + String(y) + String(" - ") + String(z)));
    delay(300);
} 

,

Компас - HMC5883

Прочитаем занчение с Компаса HMC5883
#include <Wire.h>
#include <DFRobot_QMC5883.h>
DFRobot_QMC5883 compass;
float x = 0;

void setup() {
   Serial.begin(9600);
   while (!compass.begin()){
   Serial.println(" ");
   delay(500);
}
  if(compass.isHMC() ){
    Serial.println(" ");
    compass.setRange(HMC5883L_RANGE_1_3GA);
    compass.setMeasurementMode(HMC5883L_CONTINOUS);
    compass.setDataRate(HMC5883L_DATARATE_15HZ);
    compass.setSamples(HMC5883L_SAMPLES_8);
  }else if(compass.isQMC()){
    Serial.println(" ");
    compass.setRange(QMC5883_RANGE_2GA);
   compass.setMeasurementMode(QMC5883_CONTINOUS);
   compass.setDataRate(QMC5883_DATARATE_50HZ);
    compass.setSamples(QMC5883_SAMPLES_8);
}
}

void loop() {
      Vector mag = compass.readRaw();
      float heading = atan2(mag.YAxis, mag.XAxis);
      float declinationAngle = (4.0 + (26.0 / 60.0)) / (180 / PI);
      heading += declinationAngle;
     if (heading < 0){
       heading += 2 * PI;
      }
      if (heading > 2 * PI){
        heading -= 2 * PI;
      }
      float headingDegrees = heading * 180/PI;
      x = headingDegrees;
     Serial.println(x);
     delay(300);
} 

,

Гироскоп - MPU6050

Получение данных с Гироскопа MPU6050
#include "I2Cdev.h"
#include "MPU6050.h"
#define TIME_OUT 20
int16_t ax, ay, az, gx, gy, gz;
MPU6050 accgyro;
int x = 0;
int y = 0;

void setup() {
  Serial.begin(9600);
     accgyro.initialize();
}

void loop() {
     accgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
     x = gx;
     accgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
     y = gy;
     Serial.println((String(x) + String(" - ") + String(y)));
     delay(300);
} 

,

Весы - CZL 611CD

Получим данные с модуля Весов CZL 611CD
#include "HX711.h"
#define calibration_factor -7050.0
#define DOUT  3
#define CLK  2
  HX711 scale(DOUT, CLK);
  float t = 0;

void setup() {
  Serial.begin(9600);
  scale.set_scale(calibration_factor);
  scale.tare();
}

void loop() {
     t = scale.get_units() * 45.35 / 5;
     Serial.println(t);
     delay(300);
} 

,

Лазерный дальномер - VL53L0

Получим данные с лазерного дальномера VL53L0 и отправим их в монитор порта.
#include <VL53L0X.h>

int x = 0;
VL53L0X sensor;

void setup() {
  Serial.begin(9600);
  Wire.begin();
  pinMode(A3, OUTPUT);
  digitalWrite(A3, 1);
  sensor.setTimeout(500);
  if (!sensor.init()) { while (1) {}}
  #if defined LONG_RANGE
  sensor.setSignalRateLimit(0.1);
  sensor.setVcselPulsePeriod(VL53L0X::VcselPeriodPreRange, 18);
  sensor.setVcselPulsePeriod(VL53L0X::VcselPeriodFinalRange, 14);
  #endif
  #if defined HIGH_SPEED
  sensor.setMeasurementTimingBudget(20000);
  #elif defined HIGH_ACCURACY
  sensor.setMeasurementTimingBudget(200000);
  #endif
}

void loop() {
    x = sensor.readRangeSingleMillimeters();
    Serial.println(x);
    if (x < 50) {
      pinMode(13, OUTPUT);
       digitalWrite(13, 1);
    } else {
      pinMode(13, OUTPUT);
       digitalWrite(13, 0);
    }
} 

,

Кнопка - ArduBlock

При нажати на кнопку pin 2, постоянно отправляется сообщение 111 в монитор порта.
При отпускании кнопки pin 2, постоянно отправляется сообщение 222 в монитор порта.

void setup() {
  Serial.begin(9600);
  pinMode(2, INPUT_PULLUP);

}

void loop() {
    if (digitalRead(2) == 0) {
      Serial.println("111");
      delay(300);
    } else {
      Serial.println("222");
      delay(300);
    }

} 



При нажати на кнопку pin 2, отправляется 1 раз сообщение 111 в монитор порта.
При отпускании кнопки pin 2, отправляется 1 раз сообщение 222 в монитор порта.

  int bt2 = 0;
  int bn2 = 0;
  int bc2 = 1;

void setup() {
  Serial.begin(9600);
  pinMode(2, INPUT_PULLUP);
}

void loop() {
         if (digitalRead(2) == 0 & bt2 == 0) {
             bt2 = 1;
             Serial.println("111");
             delay(300);
            }
         if (digitalRead(2) == 1 & bt2 == 1) {
             bt2 = 0;
             Serial.println("222");
             delay(300);
            }
} 



При 1 плике на кнопку pin 2, отправляется 1 раз сообщение 111 в монитор порта.
При 2 плике на кнопку pin 2, отправляется 1 раз сообщение 222 в монитор порта.

  int bt2 = 0;
  int bn2 = 0;
  int bc2 = 1;

void setup() {
  Serial.begin(9600);
  pinMode(2, INPUT_PULLUP);
}

void loop() {
     if (digitalRead(2) == 0 & bn2 == 0) {
           bc2 = bc2 * -1;
         if (bc2 == 1) {
           Serial.println("222");
           delay(300);
              }
         if (bc2 == -1) {
           Serial.println("111");
           delay(300);
               }
           delay(150);
           bn2 = 1;
         }
         if (digitalRead(2) == 1 & bn2 == 1) {
           bn2 = 0;
      }
} 

Теоретическая часть. модули ввода

Модуль Реле 220v

Программа включения и отключения реле.
void setup() {
    pinMode(2, OUTPUT);
}

void loop() {
     digitalWrite(2, 1);
    delay(1000);
     digitalWrite(2, 0);
    delay(1000);
} 

,

Диммер на ~220 вольт

Программа Arduino Диммер на ~220 вольт!
int x = 0;

void setup() {
  pinMode(3, OUTPUT);
}

void loop() {
    x = analogRead(A0);
    x = map(x, 0, 1023, 0, 255);
     analogWrite(3, x);
} 

,

Мосфет - IRF520

Полученные значения с потенциометра преобразуем и отправляем на Мосфет IRF520.
int x = 0;

void setup() {
  pinMode(3, OUTPUT);
}

void loop() {
    x = analogRead(A0);
    x = map(x, 0, 1023, 0, 255);
     analogWrite(3, x);
} 

,

Расширитель портов - MCP23017

Прочитаем значение с кнопки и отправим сигнал на светодиод.
#include <Wire.h>
#include <Adafruit_MCP23X17.h>
Adafruit_MCP23X17 mcp;

void setup() {
  mcp.begin_I2C();
  mcp.pinMode(0, INPUT);
  mcp.pinMode(15, OUTPUT);
}

void loop() {
    if (mcp.digitalRead(0)) {
        mcp.digitalWrite(15, 1);
    } else {
        mcp.digitalWrite(15, 0);
    }
} 

,

Расширитель портов - Servo PCA9685 I2C

Отправим значение на расширитель портов сервоприводов.
 #include <iarduino_MultiServo.h>
 iarduino_MultiServo MSS0x40;

void setup() {
 MSS0x40.servoSet(0, SERVO_SG90);
 MSS0x40.servoSet(7, SERVO_SG90);
 MSS0x40.begin(0x40);
}

void loop() {
    MSS0x40.servoWrite(0,byte(0));
    MSS0x40.servoWrite(7,byte(90));
    delay(1000);
    MSS0x40.servoWrite(0,byte(180));
    MSS0x40.servoWrite(7,byte(180));
    delay(1000);
} 

,

Цифровой потенциометр - X9C103S

Установка значения на цифровой потенциометре X9C103S
long zen = 0;
long zenm = 0;

void setup() {
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  digitalWrite(4, 1);
}

void loop() {
    zen = 50;
        if (zen > zenm ) {
          zenm = zenm + 1;
      digitalWrite(2, HIGH);
      digitalWrite(3, HIGH);
      digitalWrite(4, LOW);
         delayMicroseconds(1);
      digitalWrite(3, LOW);
      delayMicroseconds(1);
      digitalWrite(3, HIGH);
         delayMicroseconds(1);
      digitalWrite(4, HIGH);
        }
        if (zen < zenm) {
          zenm = zenm - 1;
      digitalWrite(2, LOW);
      digitalWrite(3, HIGH);
      digitalWrite(4, LOW);
         delayMicroseconds(1);
      digitalWrite(3, LOW);
      delayMicroseconds(1);
      digitalWrite(3, HIGH);
         delayMicroseconds(1);
      digitalWrite(4, HIGH);
        }
} 

,

Светодиод - RGB

Программа переключение цветов на RGB светодиоде.
void setup() {
  pinMode(3, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(4, OUTPUT);
  digitalWrite(4, 0);
}

void loop() {
    analogWrite(3,51);
    analogWrite(5,51);
    analogWrite(6,255);
    delay(1000);
    analogWrite(3,204);
    analogWrite(5,0);
    analogWrite(6,0);
    delay(1000);
    analogWrite(3,51);
    analogWrite(5,204);
    analogWrite(6,0);
    delay(1000);
} 

,

Сдвиговый регистр - 74HC595

2 - Две микросхемы! Если одна микросхема то укажите число 1. Включить 1 светодиод!
#include <Shift595.h>
#define   dataPin 10
#define   latchPin 9
#define   clockPin 8
#define   numOfRegisters 2
Shift595 Shifter(dataPin, latchPin, clockPin, numOfRegisters);

void setup() {
}

void loop() {
    Shifter.setRegisterPin(1, 1);
} 

,

Адресная лента - WS2812

Перемещение пикселя по адресной ленте
#include <Adafruit_NeoPixel.h>
Adafruit_NeoPixel pixels_2 = Adafruit_NeoPixel(30, 2, NEO_GRB + NEO_KHZ800);
int x = 0;

void setup() {
  pixels_2.begin();
}

void loop() {
     pixels_2.setBrightness(255);
     pixels_2.setPixelColor(x-1, pixels_2.Color(255,0,0));
     pixels_2.show();
     delay(1000);
     pixels_2.setBrightness(255);
     pixels_2.setPixelColor(x-1, pixels_2.Color(0,0,0));
     pixels_2.show();
     x = x + 1;
     if (x > 30) {
     x = 0;
    }
} 

,

Зуммер - Активный и Пассивный

При нажатии на кнопку включаем мелодию из нот



,

FM Радио - TEA5767

При клике на кнопку - отправим частоту на FM Радио TEA5767
#include <TEA5767N.h>
TEA5767N radio=TEA5767N();

void setup() {
  pinMode(2, INPUT_PULLUP);
  pinMode(3, INPUT_PULLUP);
}

void loop() {
    if (digitalRead(2) == 0) {
      radio.selectFrequency((float)107.1);
    }
    if (digitalRead(3) == 0) {
      radio.selectFrequency((float)104.3);
    }
} 

,

DFP Player Mp3

Путь сохранения на SD:\mp3\0001.mp3 -- Номер трека 1.
#include <SoftwareSerial.h>
#include <DFPlayer_Mini_Mp3.h>

void setup() {
  pinMode(2, INPUT_PULLUP);
  pinMode(3, INPUT_PULLUP);
  Serial.begin (9600);
  mp3_set_serial (Serial);
}

void loop() {
    if (digitalRead(2) == 0) {
       mp3_set_volume (30);
       mp3_play (1);
       delay(300);
    }
    if (digitalRead(3) == 0) {
       mp3_play (2);
       mp3_set_volume (30);
       mp3_play ();
       }
} 

,

Цифровой индикатор

Отображение информации на цифровом индикаторе.
#include <fDigitsSegtPin.h>
fDigitsSegtPin Display(2,3,4,5,6,7,8,9,10,11,12,13);
int x = 0;

void setup() {
 Display.begin();
 Display.doPrint_lastDot = 1;
 Display.doPrint_firstZero = 1;
 Display.doReport_overRange = 0;
}

void loop() {
    for (int count = 0; count < 100; count++) {
      Display.print(x);
    }
  x = x + 1;
} 

,

Цифровой индикатор - TM1637 x4

Отобразим счётчик с мигающим двоеточием на цифровом индикаторе TM1637 x4.
#include "TM1637.h"
TM1637 tm1637(9,10);
int x = 1234;

void setup() {
  tm1637.init();
  tm1637.set(BRIGHT_TYPICAL);
}

void loop() {
     x = x + 1;
       tm1637.point(POINT_ON);
       tm1637.display(x);
     delay(500);
       tm1637.point(POINT_OFF);
       tm1637.display(x);
     delay(500);
} 

,

Цифровой индикатор - TM1637 x6

Отобразим счётчик на цифровом индикаторе TM1637 x6.
#include "TM1637.h"
TM1637 tm1637(9,10);
int x = 0;

void setup() {
  tm1637.init();
  tm1637.set(BRIGHT_TYPICAL);
}

void loop() {
    x = x + 1;
    tm1637.point(POINT_OFF);
       if (x >= 100000) {tm1637.display(2,(x/long(pow(10, 5)))%10);} else { tm1637.display(2,17);}
       if (x >= 10000) {tm1637.display(1,(x/long(pow(10, 4)))%10);} else { tm1637.display(1,17);}
       if (x >= 1000) {tm1637.display(0,(x/long(pow(10, 3)))%10);} else { tm1637.display(0,17);}
       if (x >= 100) {tm1637.display(5,(x/long(pow(10, 2)))%10);} else { tm1637.display(5,17);}
       if (x >= 10) {tm1637.display(4,(x/long(pow(10, 1)))%10);} else { tm1637.display(4,17);}
     tm1637.display(3,(x/long(pow(10, 0)))%10);
     delay(500);
} 

,

Цифровой индикатор - MAX7219 8x

Отображение счётчика на цифровом индикаторе MAX7219
#include <LedControl.h>
LedControl lc7d=LedControl(4,6,5,1);
int x = 0;

void setup() {

}

void loop() {
      lc7d.setIntensity(0,15);
      lc7d.shutdown(0,false);
      lc7d.setDigit(0,7,(x / 10000000),false);
      lc7d.setDigit(0,6,(x / 1000000 - (x / 10000000) * 10),false);
      lc7d.setDigit(0,5,(x / 100000 - (x / 1000000) * 10),false);
      lc7d.setDigit(0,4,(x / 10000 - (x / 100000) * 10),false);
      lc7d.setDigit(0,3,(x / 1000 - (x / 10000) * 10),false);
      lc7d.setDigit(0,2,(x / 100 - (x / 1000) * 10),false);
      lc7d.setDigit(0,1,(x / 10 - (x / 100) * 10),false);
      lc7d.setDigit(0,0,(x / 1 - (x / 10) * 10),false);
      x = x + 1;
      delay(100);
} 

,

LED матрица 8х32 - MAX7219

Отображение бегущего текста на LED матрице 8х32 MAX7219
  #include <SPI.h>
  #include <Adafruit_GFXx.h>
  #include <Max72xxPanel.h>
  int pinCS = 10;
  int numberOfHorizontalDisplays = 1;
  int numberOfVerticalDisplays = 4;
  Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays);
  String tape = " ";
  int wait = 30;
  int spacer = 1;
  int width = 5 + spacer;
  int i;
  String utf8rus(String source)
  {
    int i,k;
    String target;
    unsigned char n;
    char m[2] = { '0', '\0' };
    k = source.length(); i = 0;
    while (i < k) {     n = source[i]; i++;
      if (n >= 0xC0) {
        switch (n) {
          case 0xD0: {
            n = source[i]; i++;
            if (n == 0x81) { n = 0xA8; break; }
            if (n >= 0x90 && n <= 0xBF) n = n + 0x2F;
            break;
          }
          case 0xD1: {
            n = source[i]; i++;
            if (n == 0x91) { n = 0xB7; break; }
            if (n >= 0x80 && n <= 0x8F) n = n + 0x6F;
            break;
          }
        }
      }
      m[0] = n; target = target + String(m);
    }
  return target;
  }

int x;
int y;

void setup() {
     matrix.setIntensity(5);
     matrix.setRotation(matrix.getRotation()+1);
}

void loop() {
        tape = utf8rus("ArduBlock RU EN Виталий Петров");
        for ( int i = 0 ; i < width * tape.length() + matrix.width() - 1 - spacer; i++ )
             {
             matrix.fillScreen(LOW);
             int letter = i / width;
            x = (matrix.width() - 1) - i % width;
           y = (matrix.height() - 8) / 2;
            while ( x + width - spacer >= 0 && letter >= 0 ) {
            if ( letter < tape.length() ) {
              matrix.drawChar(x, y, tape[letter], HIGH, LOW,1);
            }
            letter--;
           x -= width;
          }
          matrix.write();
          delay(30);
        }
} 

,

LED матрица 8х8 - MAX7219

Перемещение пикселя на LED матрице 8х8 MAX7219
#include <LedControl.h>
LedControl lclm=LedControl(4,6,5,1);
int x = 0;

void setup() {

}

void loop() {
    for (int count = 0; count < 7; count++) {
         lclm.setIntensity(0,15);
         lclm.shutdown(0,false);
         lclm.setLed(0,x,x,true);
       delay(100);
         lclm.setIntensity(0,15);
         lclm.shutdown(0,false);
         lclm.setLed(0,x,x,false);
       x = x + 1;
    }
    for (int count = 0; count < 7; count++) {
         lclm.setIntensity(0,15);
         lclm.shutdown(0,false);
         lclm.setLed(0,x,x,true);
       delay(100);
         lclm.setIntensity(0,15);
         lclm.shutdown(0,false);
         lclm.setLed(0,x,x,false);
       x = x - 1;
    }
} 

Теоретическая часть.Модули вывода данных

1. ИЗМЕРЕНИЕ ТЕМПЕРАТУРЫ И ВЛАЖНОСТИ

Базовые задания

Задание 1: Измерение температуры и влажности с DHT11

cpp
#include <DHT.h> #define DHTPIN 2 // Пин, к которому подключен DHT11 #define DHTTYPE DHT11 // Указываем тип сенсора DHT dht(DHTPIN, DHTTYPE); // Создаем объект DHT void setup() { Serial.begin(9600); // Инициализируем последовательный порт dht.begin(); // Инициализируем сенсор DHT } void loop() { delay(2000); // Задержка между измерениями float h = dht.readHumidity(); // Чтение влажности float t = dht.readTemperature(); // Чтение температуры // Проверяем, удалось ли получить данные if (isnan(h) || isnan(t)) { Serial.println("Ошибка чтения с DHT!"); return; } // Выводим результаты Serial.print("Температура: "); Serial.print(t); Serial.print(" °C, Влажность: "); Serial.print(h); Serial.println(" %"); }

Задание 2: Определение комфорта в помещении

cpp
#include <DHT.h> #define DHTPIN 2 #define DHTTYPE DHT11 DHT dht(DHTPIN, DHTTYPE); void setup() { Serial.begin(9600); dht.begin(); } void loop() { delay(2000); float h = dht.readHumidity(); float t = dht.readTemperature(); if (isnan(h) || isnan(t)) { Serial.println("Ошибка чтения с DHT!"); return; } // Проверка комфорта if (h > 60 || t > 25) { Serial.println("Неприятные условия!"); } else { Serial.println("Условия комфортные."); } }

Задание 3: Логирование данных в Serial Monitor

cpp
#include <DHT.h> #define DHTPIN 2 #define DHTTYPE DHT11 DHT dht(DHTPIN, DHTTYPE); void setup() { Serial.begin(9600); dht.begin(); } void loop() { delay(2000); float h = dht.readHumidity(); float t = dht.readTemperature(); if (isnan(h) || isnan(t)) { Serial.println("Ошибка чтения с DHT!"); return; } Serial.print("Температура: "); Serial.print(t); Serial.print(" °C, Влажность: "); Serial.print(h); Serial.println(" %"); }

Задание 4: Сигнализация при высоких температурах

cpp
#include <DHT.h> #define DHTPIN 2 #define DHTTYPE DHT11 DHT dht(DHTPIN, DHTTYPE); void setup() { Serial.begin(9600); dht.begin(); } void loop() { delay(2000); float t = dht.readTemperature(); if (isnan(t)) { Serial.println("Ошибка чтения с DHT!"); return; } if (t > 30) { Serial.println("Предупреждение: Высокая температура!"); } }

Задание 5: Вывод значений на LCD-дисплей (если есть)

cpp
#include <DHT.h> #include <LiquidCrystal.h> #define DHTPIN 2 #define DHTTYPE DHT11 DHT dht(DHTPIN, DHTTYPE); LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // Инициализация LCD void setup() { lcd.begin(16, 2); dht.begin(); } void loop() { delay(2000); float h = dht.readHumidity(); float t = dht.readTemperature(); if (isnan(h) || isnan(t)) { lcd.print("Ошибка!"); return; } lcd.clear(); lcd.print("T:"); lcd.print(t); lcd.print("C"); lcd.setCursor(0, 1); lcd.print("H:"); lcd.print(h); lcd.print("%"); }

Сложные задания

Задание 1: Построение графика температуры и влажности с использованием SD-карты

cpp
#include <DHT.h> #include <SPI.h> #include <SD.h> #define DHTPIN 2 #define DHTTYPE DHT11 #define chipSelect 10 DHT dht(DHTPIN, DHTTYPE); File dataFile; void setup() { Serial.begin(9600); dht.begin(); SD.begin(chipSelect); dataFile = SD.open("data.txt", FILE_WRITE); } void loop() { delay(2000); float h = dht.readHumidity(); float t = dht.readTemperature(); if (dataFile) { dataFile.print("Температура: "); dataFile.print(t); dataFile.print(" °C, Влажность: "); dataFile.print(h); dataFile.println(" %"); dataFile.flush(); // Сохраняем данные на SD-карте } else { Serial.println("Ошибка открытия файла!"); } }

Задание 2: Умный термометр с Wi-Fi

cpp
#include <DHT.h> #include <ESP8266WiFi.h> #define DHTPIN 2 #define DHTTYPE DHT11 DHT dht(DHTPIN, DHTTYPE); // Настройки Wi-Fi const char* ssid = "your_SSID"; const char* password = "your_PASSWORD"; void setup() { Serial.begin(9600); dht.begin(); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Подключение к WiFi..."); } Serial.println("Подключено к WiFi!"); } void loop() { delay(2000); float h = dht.readHumidity(); float t = dht.readTemperature(); Serial.print("Температура: "); Serial.print(t); Serial.print(" °C, Влажность: "); Serial.print(h); Serial.println(" %"); }

Задание 3: Управление вентилятором в зависимости от температуры

cpp
#include <DHT.h> #define DHTPIN 2 #define DHTTYPE DHT11 #define FAN_PIN 9 // Пин для вентилятора DHT dht(DHTPIN, DHTTYPE); void setup() { Serial.begin(9600); dht.begin(); pinMode(FAN_PIN, OUTPUT); } void loop() { delay(2000); float t = dht.readTemperature(); if (isnan(t)) { Serial.println("Ошибка чтения с DHT!"); return; } if (t > 25) { digitalWrite(FAN_PIN, HIGH); // Включаем вентилятор } else { digitalWrite(FAN_PIN, LOW); // Выключаем вентилятор } }

Задание 4: Умный климат-контроль с LCD-дисплеем

cpp
#include <DHT.h> #include <LiquidCrystal.h> #define DHTPIN 2 #define DHTTYPE DHT11 DHT dht(DHTPIN, DHTTYPE); LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // Инициализация LCD void setup() { lcd.begin(16, 2); dht.begin(); } void loop() { delay(2000); float h = dht.readHumidity(); float t = dht.readTemperature(); if (isnan(h) || isnan(t)) { lcd.print("Ошибка!"); return; } lcd.clear(); lcd.print("T:"); lcd.print(t); lcd.print("C H:"); lcd.print(h); lcd.print("%"); // Условия для включения/выключения вентилятора if (h > 60) { lcd.setCursor(0, 1); lcd.print("Влажность высокая!"); } }

Задание 5: Отправка данных на сервер через HTTP

cpp
#include <DHT.h> #include <ESP8266WiFi.h> #include <WiFiClient.h> #define DHTPIN 2 #define DHTTYPE DHT11 DHT dht(DHTPIN, DHTTYPE); // Настройки Wi-Fi const char* ssid = "your_SSID"; const char* password = "your_PASSWORD"; const char* server = "http://your-server.com"; // URL вашего сервера void setup() { Serial.begin(9600); dht.begin(); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Подключение к WiFi..."); } Serial.println("Подключено к WiFi!"); } void loop() { delay(2000); float h = dht.readHumidity(); float t = dht.readTemperature(); // Отправка данных на сервер WiFiClient client; if (client.connect(server, 80)) { client.print(String("GET /update?temp=") + t + "&hum=" + h + " HTTP/1.1\r\n" + "Host: " + server + "\r\n" + "Connection: close\r\n\r\n"); } }

2. ЦИФРОВОЙ СЕНСОР СВЕТА

Базовые задания

Задание 1: Чтение значений света с LDR

cpp
#define LDR_PIN A0 // Пин, к которому подключен LDR void setup() { Serial.begin(9600); } void loop() { int lightValue = analogRead(LDR_PIN); // Чтение значения с LDR Serial.print("Уровень света: "); Serial.println(lightValue); delay(1000); }

Задание 2: Сигнализация при низком уровне света

cpp
#define LDR_PIN A0 // Пин для LDR #define LED_PIN 9 // Пин для светодиода void setup() { pinMode(LED_PIN, OUTPUT); Serial.begin(9600); } void loop() { int lightValue = analogRead(LDR_PIN); Serial.print("Уровень света: "); Serial.println(lightValue); // Включаем светодиод при низком уровне света if (lightValue < 200) { digitalWrite(LED_PIN, HIGH); } else { digitalWrite(LED_PIN, LOW); } delay(1000); }

Задание 3: Использование LDR для автоматического управления освещением

cpp
#define LDR_PIN A0 #define RELAY_PIN 8 // Пин для реле void setup() { pinMode(RELAY_PIN, OUTPUT); Serial.begin(9600); } void loop() { int lightValue = analogRead(LDR_PIN); Serial.print("Уровень света: "); Serial.println(lightValue); // Включаем реле при низком уровне света if (lightValue < 200) { digitalWrite(RELAY_PIN, HIGH); } else { digitalWrite(RELAY_PIN, LOW); } delay(1000); }

Задание 4: Вывод уровня света на LCD-дисплей

cpp
#include <LiquidCrystal.h> #define LDR_PIN A0 LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // Инициализация LCD void setup() { lcd.begin(16, 2); } void loop() { int lightValue = analogRead(LDR_PIN); lcd.clear(); lcd.print("Уровень света: "); lcd.setCursor(0, 1); lcd.print(lightValue); delay(1000); }

Задание 5: Создание графика уровня света с использованием Serial Plotter

cpp
#define LDR_PIN A0 void setup() { Serial.begin(9600); } void loop() { int lightValue = analogRead(LDR_PIN); Serial.println(lightValue); delay(100); // Отправляем данные каждые 100 мс }

Сложные задания

Задание 1: Автоматическая регулировка яркости светодиода

cpp
#define LDR_PIN A0 #define LED_PIN 9 // Пин для светодиода void setup() { pinMode(LED_PIN, OUTPUT); Serial.begin(9600); } void loop() { int lightValue = analogRead(LDR_PIN); int brightness = map(lightValue, 0, 1023, 255, 0); // Преобразуем значение analogWrite(LED_PIN, brightness); // Устанавливаем яркость delay(1000); }

Задание 2: Ведение журнала уровня света на SD-карте

cpp
#include <SPI.h> #include <SD.h> #define LDR_PIN A0 #define chipSelect 10 File dataFile; void setup() { Serial.begin(9600); SD.begin(chipSelect); dataFile = SD.open("lightData.txt", FILE_WRITE); } void loop() { int lightValue = analogRead(LDR_PIN); if (dataFile) { dataFile.println(lightValue); // Запись данных в файл dataFile.flush(); } else { Serial.println("Ошибка открытия файла!"); } delay(1000); }

Задание 3: Создание приложения для визуализации уровня света с использованием Wi-Fi

cpp
#include <ESP8266WiFi.h> #define LDR_PIN A0 const char* ssid = "your_SSID"; const char* password = "your_PASSWORD"; void setup() { Serial.begin(9600); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Подключение к WiFi..."); } Serial.println("Подключено к WiFi!"); } void loop() { int lightValue = analogRead(LDR_PIN); Serial.print("Уровень света: "); Serial.println(lightValue); delay(1000); }

Задание 4: Создание автоматической системы управления освещением

cpp
#define LDR_PIN A0 #define RELAY_PIN 8 void setup() { pinMode(RELAY_PIN, OUTPUT); Serial.begin(9600); } void loop() { int lightValue = analogRead(LDR_PIN); if (lightValue < 300) { // Низкий уровень света digitalWrite(RELAY_PIN, HIGH); // Включить свет } else { digitalWrite(RELAY_PIN, LOW); // Выключить свет } delay(1000); }

Задание 5: Создание сервера для управления освещением через веб-интерфейс

cpp
#include <ESP8266WiFi.h> #include <WiFiClient.h> #include <ESP8266WebServer.h> #define LDR_PIN A0 #define RELAY_PIN 8 ESP8266WebServer server(80); void handleRoot() { int lightValue = analogRead(LDR_PIN); String message = "Уровень света: " + String(lightValue); server.send(200, "text/plain", message); } void setup() { pinMode(RELAY_PIN, OUTPUT); WiFi.begin("your_SSID", "your_PASSWORD"); server.on("/", handleRoot); server.begin(); } void loop() { server.handleClient(); }

3. PASSIVE INFRARED SENSOR (PIR)

Базовые задания

Задание 1: Обнаружение движения с PIR

cpp
#define PIR_PIN 2 // Пин для PIR сенсора void setup() { pinMode(PIR_PIN, INPUT); Serial.begin(9600); } void loop() { int motion = digitalRead(PIR_PIN); // Чтение значения с PIR if (motion) { Serial.println("Движение обнаружено!"); } else { Serial.println("Движения нет."); } delay(1000); }

Задание 2: Включение светодиода при обнаружении движения

cpp
#define PIR_PIN 2 // Пин для PIR #define LED_PIN 9 // Пин для светодиода void setup() { pinMode(PIR_PIN, INPUT); pinMode(LED_PIN, OUTPUT); Serial.begin(9600); } void loop() { int motion = digitalRead(PIR_PIN); if (motion) { Serial.println("Движение обнаружено!"); digitalWrite(LED_PIN, HIGH); // Включаем светодиод } else { digitalWrite(LED_PIN, LOW); // Выключаем светодиод } delay(1000); }

Задание 3: Использование PIR для автоматического включения освещения

cpp
#define PIR_PIN 2 #define RELAY_PIN 8 // Пин для реле void setup() { pinMode(PIR_PIN, INPUT); pinMode(RELAY_PIN, OUTPUT); Serial.begin(9600); } void loop() { int motion = digitalRead(PIR_PIN); if (motion) { Serial.println("Движение обнаружено! Включаем свет."); digitalWrite(RELAY_PIN, HIGH); // Включаем свет } else { digitalWrite(RELAY_PIN, LOW); // Выключаем свет } delay(1000); }

Задание 4: Отправка уведомлений на телефон при обнаружении движения

cpp
#include <ESP8266WiFi.h> #include <WiFiClient.h> #define PIR_PIN 2 const char* ssid = "your_SSID"; const char* password = "your_PASSWORD"; void setup() { pinMode(PIR_PIN, INPUT); Serial.begin(9600); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Подключение к WiFi..."); } Serial.println("Подключено к WiFi!"); } void loop() { int motion = digitalRead(PIR_PIN); if (motion) { Serial.println("Движение обнаружено!"); // Отправка уведомления (например, через IFTTT или другой API) } delay(1000); }

Задание 5: Вывод информации на LCD-дисплей

cpp
#include <LiquidCrystal.h> #define PIR_PIN 2 LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // Инициализация LCD void setup() { pinMode(PIR_PIN, INPUT); lcd.begin(16, 2); } void loop() { int motion = digitalRead(PIR_PIN); lcd.clear(); if (motion) { lcd.print("Движение обнаружено!"); } else { lcd.print("Движения нет."); } delay(1000); }

Сложные задания

Задание 1: Ведение журнала обнаруженных движений на SD-карте

cpp
#include <SPI.h> #include <SD.h> #define PIR_PIN 2 #define chipSelect 10 File dataFile; void setup() { pinMode(PIR_PIN, INPUT); Serial.begin(9600); SD.begin(chipSelect); dataFile = SD.open("motionLog.txt", FILE_WRITE); } void loop() { int motion = digitalRead(PIR_PIN); if (motion) { Serial.println("Движение обнаружено!"); if (dataFile) { dataFile.println("Движение обнаружено!"); dataFile.flush(); } } delay(1000); }

Задание 2: Создание системы охраны с SMS-уведомлениями

cpp
#include <ESP8266WiFi.h> #include <WiFiClient.h> #define PIR_PIN 2 const char* ssid = "your_SSID"; const char* password = "your_PASSWORD"; void setup() { pinMode(PIR_PIN, INPUT); Serial.begin(9600); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Подключение к WiFi..."); } Serial.println("Подключено к WiFi!"); } void loop() { int motion = digitalRead(PIR_PIN); if (motion) { Serial.println("Движение обнаружено!"); // Отправка SMS через API (например, Twilio) } delay(1000); }

Задание 3: Использование PIR для управления камерами видеонаблюдения

cpp
#define PIR_PIN 2 #define CAMERA_PIN 8 // Пин для управления камерой void setup() { pinMode(PIR_PIN, INPUT); pinMode(CAMERA_PIN, OUTPUT); Serial.begin(9600); } void loop() { int motion = digitalRead(PIR_PIN); if (motion) { Serial.println("Движение обнаружено! Включаем камеру."); digitalWrite(CAMERA_PIN, HIGH); // Включаем камеру delay(10000); // Камера будет работать 10 секунд digitalWrite(CAMERA_PIN, LOW); // Выключаем камеру } delay(1000); }

Задание 4: Автоматическое выключение света при отсутствии движения

cpp
#define PIR_PIN 2 #define RELAY_PIN 8 // Пин для реле void setup() { pinMode(PIR_PIN, INPUT); pinMode(RELAY_PIN, OUTPUT); Serial.begin(9600); } void loop() { int motion = digitalRead(PIR_PIN); if (motion) { Serial.println("Движение обнаружено! Включаем свет."); digitalWrite(RELAY_PIN, HIGH); // Включаем свет } else { Serial.println("Движения нет! Выключаем свет."); digitalWrite(RELAY_PIN, LOW); // Выключаем свет } delay(1000); }

Задание 5: Управление охранной системой через веб-интерфейс

cpp
#include <ESP8266WiFi.h> #include <WiFiClient.h> #include <ESP8266WebServer.h> #define PIR_PIN 2 ESP8266WebServer server(80); void handleRoot() { int motion = digitalRead(PIR_PIN); String message = motion ? "Движение обнаружено!" : "Движения нет."; server.send(200, "text/plain", message); } void setup() { pinMode(PIR_PIN, INPUT); WiFi.begin("your_SSID", "your_PASSWORD"); server.on("/", handleRoot); server.begin(); } void loop() { server.handleClient(); }

4. АКСЕЛЕРОМЕТР

Базовые задания

Задание 1: Чтение значений акселерометра с MPU6050

cpp
#include <Wire.h> #include <MPU6050.h> MPU6050 accel; void setup() { Wire.begin(); Serial.begin(9600); accel.initialize(); } void loop() { int16_t ax, ay, az; accel.getAcceleration(&ax, &ay, &az); // Чтение значений акселерометра Serial.print("ax: "); Serial.print(ax); Serial.print(" ay: "); Serial.print(ay); Serial.print(" az: "); Serial.println(az); delay(1000); }

Задание 2: Определение наклона устройства

cpp
#include <Wire.h> #include <MPU6050.h> MPU6050 accel; void setup() { Wire.begin(); Serial.begin(9600); accel.initialize(); } void loop() { int16_t ax, ay, az; accel.getAcceleration(&ax, &ay, &az); float angleX = atan2(ay, az) * 180.0 / PI; // Вычисление угла Serial.print("Угол наклона по X: "); Serial.println(angleX); delay(1000); }

Задание 3: Отслеживание движения по осям X, Y, Z

cpp
#include <Wire.h> #include <MPU6050.h> MPU6050 accel; void setup() { Wire.begin(); Serial.begin(9600); accel.initialize(); } void loop() { int16_t ax, ay, az; accel.getAcceleration(&ax, &ay, &az); Serial.print("ax: "); Serial.print(ax); Serial.print(" ay: "); Serial.print(ay); Serial.print(" az: "); Serial.println(az); delay(1000); }

Задание 4: Управление светодиодом на основе движения

cpp
#include <Wire.h> #include <MPU6050.h> #define LED_PIN 9 // Пин для светодиода MPU6050 accel; void setup() { pinMode(LED_PIN, OUTPUT); Wire.begin(); Serial.begin(9600); accel.initialize(); } void loop() { int16_t ax, ay, az; accel.getAcceleration(&ax, &ay, &az); // Если значение по оси X превышает порог, включаем светодиод if (ax > 10000) { digitalWrite(LED_PIN, HIGH); } else { digitalWrite(LED_PIN, LOW); } delay(1000); }

Задание 5: Отправка данных на сервер через Wi-Fi

cpp
#include <Wire.h> #include <MPU6050.h> #include <ESP8266WiFi.h> MPU6050 accel; const char* ssid = "your_SSID"; const char* password = "your_PASSWORD"; void setup() { Wire.begin(); Serial.begin(9600); accel.initialize(); WiFi.begin(ssid, password); } void loop() { int16_t ax, ay, az; accel.getAcceleration(&ax, &ay, &az); // Отправка данных на сервер (например, через HTTP) Serial.print("ax: "); Serial.println(ax); delay(1000); }

Сложные задания

Задание 1: Создание системы обнаружения падения

cpp
#include <Wire.h> #include <MPU6050.h> MPU6050 accel; void setup() { Wire.begin(); Serial.begin(9600); accel.initialize(); } void loop() { int16_t ax, ay, az; accel.getAcceleration(&ax, &ay, &az); // Определяем падение по значению ускорения if (az < 0) { Serial.println("Падение обнаружено!"); } delay(1000); }

Задание 2: Построение графика движения с использованием Serial Plotter

cpp
#include <Wire.h> #include <MPU6050.h> MPU6050 accel; void setup() { Wire.begin(); Serial.begin(9600); accel.initialize(); } void loop() { int16_t ax, ay, az; accel.getAcceleration(&ax, &ay, &az); Serial.print(ax); Serial.print(", "); Serial.print(ay); Serial.print(", "); Serial.println(az); delay(100); }

Задание 3: Ведение журнала значений акселерометра на SD-карте

cpp
#include <Wire.h> #include <MPU6050.h> #include <SPI.h> #include <SD.h> MPU6050 accel; #define chipSelect 10 File dataFile; void setup() { Wire.begin(); Serial.begin(9600); accel.initialize(); SD.begin(chipSelect); dataFile = SD.open("accelData.txt", FILE_WRITE); } void loop() { int16_t ax, ay, az; accel.getAcceleration(&ax, &ay, &az); if (dataFile) { dataFile.print(ax); dataFile.print(", "); dataFile.print(ay); dataFile.print(", "); dataFile.println(az); dataFile.flush(); } else { Serial.println("Ошибка открытия файла!"); } delay(1000); }

Задание 4: Создание приложения для визуализации данных акселерометра через Wi-Fi

cpp
#include <Wire.h> #include <MPU6050.h> #include <ESP8266WiFi.h> MPU6050 accel; const char* ssid = "your_SSID"; const char* password = "your_PASSWORD"; void setup() { Wire.begin(); Serial.begin(9600); accel.initialize(); WiFi.begin(ssid, password); } void loop() { int16_t ax, ay, az; accel.getAcceleration(&ax, &ay, &az); // Отправка данных на сервер Serial.print("ax: "); Serial.print(ax); Serial.print(" ay: "); Serial.print(ay); Serial.print(" az: "); Serial.println(az); delay(1000); }

Задание 5: Использование акселерометра для управления игрушками или устройствами

cpp
#include <Wire.h> #include <MPU6050.h> MPU6050 accel; void setup() { Wire.begin(); Serial.begin(9600); accel.initialize(); } void loop() { int16_t ax, ay, az; accel.getAcceleration(&ax, &ay, &az); // Управление устройством на основе значений акселерометра if (ax > 10000) { Serial.println("Двигаться вперед"); } else if (ax < -10000) { Serial.println("Двигаться назад"); } delay(1000); }

1.

СЕНСОРЫ РАССТОЯНИЯ (НАПРИМЕР, HC-SR04)

Базовые задания

Задание 1: Измерение расстояния до объекта

cpp
#define trigPin 9 // Пин для сигнала #define echoPin 10 // Пин для приема сигнала void setup() { Serial.begin(9600); // Инициализация последовательного порта pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); } void loop() { long duration, distance; // Отправляем ультразвуковой сигнал digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); // Получаем время, за которое сигнал вернулся duration = pulseIn(echoPin, HIGH); // Вычисляем расстояние в сантиметрах distance = duration * 0.034 / 2; // Выводим результат Serial.print("Расстояние: "); Serial.print(distance); Serial.println(" см"); delay(1000); }

Задание 2: Измерение расстояния и включение светодиода при приближении объекта

cpp
#define trigPin 9 #define echoPin 10 #define ledPin 8 void setup() { Serial.begin(9600); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); pinMode(ledPin, OUTPUT); } void loop() { long duration, distance; digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); distance = duration * 0.034 / 2; // Включаем светодиод, если объект ближе 10 см if (distance < 10) { digitalWrite(ledPin, HIGH); } else { digitalWrite(ledPin, LOW); } Serial.print("Расстояние: "); Serial.print(distance); Serial.println(" см"); delay(1000); }

Задание 3: Измерение расстояния с использованием ЖК-дисплея

cpp
#include <LiquidCrystal.h> #define trigPin 9 #define echoPin 10 LiquidCrystal lcd(12, 11, 5, 4, 3, 2); void setup() { Serial.begin(9600); lcd.begin(16, 2); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); } void loop() { long duration, distance; digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); distance = duration * 0.034 / 2; lcd.clear(); lcd.print("Расст.: "); lcd.print(distance); lcd.print(" см"); delay(1000); }

Задание 4: Сигнализация при слишком близком расстоянии

cpp
#define trigPin 9 #define echoPin 10 #define buzzerPin 8 void setup() { Serial.begin(9600); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); pinMode(buzzerPin, OUTPUT); } void loop() { long duration, distance; digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); distance = duration * 0.034 / 2; // Если расстояние меньше 5 см, включаем буззер if (distance < 5) { digitalWrite(buzzerPin, HIGH); } else { digitalWrite(buzzerPin, LOW); } Serial.print("Расстояние: "); Serial.print(distance); Serial.println(" см"); delay(1000); }

Задание 5: Построение графика расстояний на Serial Plotter

cpp
void setup() { Serial.begin(9600); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); } void loop() { long duration, distance; digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); distance = duration * 0.034 / 2; Serial.println(distance); delay(100); }

Сложные задания

Задание 1: Создание системы предупреждения о препятствии с помощью серво

cpp
#include <Servo.h> #define trigPin 9 #define echoPin 10 Servo myServo; void setup() { Serial.begin(9600); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); myServo.attach(6); // Подключаем серво к пину 6 } void loop() { long duration, distance; digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); distance = duration * 0.034 / 2; if (distance < 15) { myServo.write(90); // Поворачиваем серво на 90 градусов } else { myServo.write(0); // Возвращаем в исходное положение } Serial.print("Расстояние: "); Serial.print(distance); Serial.println(" см"); delay(1000); }

Задание 2: Использование нескольких сенсоров расстояния для создания карты окружения

cpp
#define trigPin1 9 #define echoPin1 10 #define trigPin2 11 #define echoPin2 12 void setup() { Serial.begin(9600); pinMode(trigPin1, OUTPUT); pinMode(echoPin1, INPUT); pinMode(trigPin2, OUTPUT); pinMode(echoPin2, INPUT); } void loop() { long distance1, distance2; distance1 = measureDistance(trigPin1, echoPin1); distance2 = measureDistance(trigPin2, echoPin2); Serial.print("Расстояние 1: "); Serial.print(distance1); Serial.print(" см, Расстояние 2: "); Serial.print(distance2); Serial.println(" см"); delay(1000); } long measureDistance(int trigPin, int echoPin) { long duration; digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); return duration * 0.034 / 2; }

Задание 3: Построение тепловой карты с помощью нескольких датчиков

cpp
#define NUM_SENSORS 3 int trigPins[NUM_SENSORS] = {9, 10, 11}; int echoPins[NUM_SENSORS] = {12, 13, A0}; void setup() { Serial.begin(9600); for (int i = 0; i < NUM_SENSORS; i++) { pinMode(trigPins[i], OUTPUT); pinMode(echoPins[i], INPUT); } } void loop() { for (int i = 0; i < NUM_SENSORS; i++) { long distance = measureDistance(trigPins[i], echoPins[i]); Serial.print("Датчик "); Serial.print(i + 1); Serial.print(": "); Serial.print(distance); Serial.println(" см"); } delay(1000); } long measureDistance(int trigPin, int echoPin) { long duration; digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); return duration * 0.034 / 2; }

Задание 4: Создание системы автопарковки на основе данных сенсоров расстояния

cpp
#define trigPin 9 #define echoPin 10 #define motorPin1 6 #define motorPin2 7 void setup() { Serial.begin(9600); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); pinMode(motorPin1, OUTPUT); pinMode(motorPin2, OUTPUT); } void loop() { long distance = measureDistance(trigPin, echoPin); if (distance < 20) { // Если объект близко, двигаться назад digitalWrite(motorPin1, LOW); digitalWrite(motorPin2, HIGH); } else { // Иначе двигаться вперед digitalWrite(motorPin1, HIGH); digitalWrite(motorPin2, LOW); } Serial.print("Расстояние: "); Serial.print(distance); Serial.println(" см"); delay(1000); } long measureDistance(int trigPin, int echoPin) { long duration; digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); return duration * 0.034 / 2; }

Задание 5: Создание системы мониторинга уровня воды в резервуаре

cpp
#define trigPin 9 #define echoPin 10 void setup() { Serial.begin(9600); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); } void loop() { long distance = measureDistance(trigPin, echoPin); if (distance < 10) { Serial.println("Уровень воды высокий!"); } else { Serial.println("Уровень воды нормальный."); } delay(1000); } long measureDistance(int trigPin, int echoPin) { long duration; digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); return duration * 0.034 / 2; }

2.

Базовые задания

Задание 1: Измерение уровня газа

cpp
#define gasPin A0 void setup() { Serial.begin(9600); } void loop() { int gasLevel = analogRead(gasPin); Serial.print("Уровень газа: "); Serial.println(gasLevel); delay(1000); }

Задание 2: Определение опасного уровня газа

cpp
#define gasPin A0 #define ledPin 9 void setup() { Serial.begin(9600); pinMode(ledPin, OUTPUT); } void loop() { int gasLevel = analogRead(gasPin); // Если уровень газа выше порога, включаем светодиод if (gasLevel > 300) { digitalWrite(ledPin, HIGH); } else { digitalWrite(ledPin, LOW); } Serial.print("Уровень газа: "); Serial.println(gasLevel); delay(1000); }

Задание 3: Отправка данных о газе через последовательный порт

cpp
#define gasPin A0 void setup() { Serial.begin(9600); } void loop() { int gasLevel = analogRead(gasPin); Serial.print("Уровень газа: "); Serial.println(gasLevel); delay(1000); }

Задание 4: Активация сигнализации при повышенном уровне газа

cpp
#define gasPin A0 #define buzzerPin 9 void setup() { Serial.begin(9600); pinMode(buzzerPin, OUTPUT); } void loop() { int gasLevel = analogRead(gasPin); // Если уровень газа выше порога, включаем буззер if (gasLevel > 300) { digitalWrite(buzzerPin, HIGH); } else { digitalWrite(buzzerPin, LOW); } Serial.print("Уровень газа: "); Serial.println(gasLevel); delay(1000); }

Задание 5: Ведение журнала уровня газа на SD-карте

cpp
#include <SPI.h> #include <SD.h> #define gasPin A0 #define chipSelect 10 File dataFile; void setup() { Serial.begin(9600); SD.begin(chipSelect); dataFile = SD.open("gasData.txt", FILE_WRITE); } void loop() { int gasLevel = analogRead(gasPin); if (dataFile) { dataFile.println(gasLevel); dataFile.flush(); } else { Serial.println("Ошибка открытия файла!"); } Serial.print("Уровень газа: "); Serial.println(gasLevel); delay(1000); }

Сложные задания

Задание 1: Автоматизация вентиляции при повышенном уровне газа

cpp
#define gasPin A0 #define fanPin 9 void setup() { Serial.begin(9600); pinMode(fanPin, OUTPUT); } void loop() { int gasLevel = analogRead(gasPin); // Включаем вентилятор, если уровень газа слишком высокий if (gasLevel > 300) { digitalWrite(fanPin, HIGH); } else { digitalWrite(fanPin, LOW); } Serial.print("Уровень газа: "); Serial.println(gasLevel); delay(1000); }

Задание 2: Создание системы удаленного мониторинга уровня газа через Wi-Fi

cpp
#include <ESP8266WiFi.h> #define gasPin A0 const char* ssid = "your_SSID"; const char* password = "your_PASSWORD"; void setup() { Serial.begin(9600); WiFi.begin(ssid, password); } void loop() { int gasLevel = analogRead(gasPin); // Отправка данных на сервер (или другой хост) Serial.print("Уровень газа: "); Serial.println(gasLevel); delay(1000); }

Задание 3: Отправка уведомлений о высоком уровне газа на телефон через Telegram

cpp
#include <WiFiClientSecure.h> #include <UniversalTelegramBot.h> #define gasPin A0 const char* ssid = "your_SSID"; const char* password = "your_PASSWORD"; const char* botToken = "your_BOT_TOKEN"; const char* chatId = "your_CHAT_ID"; WiFiClientSecure client; UniversalTelegramBot bot(botToken, client); void setup() { Serial.begin(9600); WiFi.begin(ssid, password); client.setInsecure(); } void loop() { int gasLevel = analogRead(gasPin); if (gasLevel > 300) { bot.sendMessage(chatId, "Внимание! Высокий уровень газа!", ""); } Serial.print("Уровень газа: "); Serial.println(gasLevel); delay(1000); }

Задание 4: Построение графика уровня газа на Serial Plotter

cpp
#define gasPin A0 void setup() { Serial.begin(9600); } void loop() { int gasLevel = analogRead(gasPin); Serial.println(gasLevel); delay(100); }

Задание 5: Создание системы анализа данных о газе и их визуализация на веб-странице

cpp
#include <ESP8266WebServer.h> #define gasPin A0 ESP8266WebServer server(80); void setup() { Serial.begin(9600); WiFi.begin("your_SSID", "your_PASSWORD"); server.on("/", HTTP_GET, []() { int gasLevel = analogRead(gasPin); String message = "Уровень газа: " + String(gasLevel); server.send(200, "text/plain", message); }); server.begin(); } void loop() { server.handleClient(); }

3.

МИКРОФОННЫЙ МОДУЛЬ (НАПРИМЕР, KY-038)

Базовые задания

Задание 1: Измерение уровня звука

cpp
#define micPin A0 void setup() { Serial.begin(9600); } void loop() { int soundLevel = analogRead(micPin); Serial.print("Уровень звука: "); Serial.println(soundLevel); delay(1000); }

Задание 2: Включение светодиода при превышении порога звука

cpp
#define micPin A0 #define ledPin 9 void setup() { Serial.begin(9600); pinMode(ledPin, OUTPUT); } void loop() { int soundLevel = analogRead(micPin); // Если уровень звука превышает порог, включаем светодиод if (soundLevel > 512) { digitalWrite(ledPin, HIGH); } else { digitalWrite(ledPin, LOW); } Serial.print("Уровень звука: "); Serial.println(soundLevel); delay(1000); }

Задание 3: Регистрация звуковых событий

cpp
#define micPin A0 void setup() { Serial.begin(9600); } void loop() { int soundLevel = analogRead(micPin); // Регистрация звукового события if (soundLevel > 512) { Serial.println("Звук обнаружен!"); } delay(1000); }

Задание 4: Измерение уровня звука и отображение на ЖК-дисплее

cpp
#include <LiquidCrystal.h> #define micPin A0 LiquidCrystal lcd(12, 11, 5, 4, 3, 2); void setup() { Serial.begin(9600); lcd.begin(16, 2); } void loop() { int soundLevel = analogRead(micPin); lcd.clear(); lcd.print("Уровень звука: "); lcd.print(soundLevel); delay(1000); }

Задание 5: Создание системы мониторинга звука с записью в файл

cpp
#include <SPI.h> #include <SD.h> #define micPin A0 #define chipSelect 10 File dataFile; void setup() { Serial.begin(9600); SD.begin(chipSelect); dataFile = SD.open("soundData.txt", FILE_WRITE); } void loop() { int soundLevel = analogRead(micPin); if (dataFile) { dataFile.println(soundLevel); dataFile.flush(); } else { Serial.println("Ошибка открытия файла!"); } Serial.print("Уровень звука: "); Serial.println(soundLevel); delay(1000); }

Сложные задания

Задание 1: Запись звука на SD-карту

cpp
#include <SPI.h> #include <SD.h> #define micPin A0 #define chipSelect 10 File dataFile; void setup() { Serial.begin(9600); SD.begin(chipSelect); dataFile = SD.open("soundData.txt", FILE_WRITE); } void loop() { int soundLevel = analogRead(micPin); if (dataFile) { dataFile.println(soundLevel); dataFile.flush(); } else { Serial.println("Ошибка открытия файла!"); } delay(100); }

Задание 2: Анализ звуковых сигналов и реакция на них

cpp
#define micPin A0 #define ledPin 9 void setup() { Serial.begin(9600); pinMode(ledPin, OUTPUT); } void loop() { int soundLevel = analogRead(micPin); // Реакция на резкий звук if (soundLevel > 800) { digitalWrite(ledPin, HIGH); delay(1000); digitalWrite(ledPin, LOW); } Serial.print("Уровень звука: "); Serial.println(soundLevel); delay(1000); }

Задание 3: Отправка уведомлений о звуковых событиях через Telegram

cpp
#include <WiFiClientSecure.h> #include <UniversalTelegramBot.h> #define micPin A0 const char* ssid = "your_SSID"; const char* password = "your_PASSWORD"; const char* botToken = "your_BOT_TOKEN"; const char* chatId = "your_CHAT_ID"; WiFiClientSecure client; UniversalTelegramBot bot(botToken, client); void setup() { Serial.begin(9600); WiFi.begin(ssid, password); client.setInsecure(); } void loop() { int soundLevel = analogRead(micPin); if (soundLevel > 800) { bot.sendMessage(chatId, "Внимание! Высокий уровень звука!", ""); } Serial.print("Уровень звука: "); Serial.println(soundLevel); delay(1000); }

Задание 4: Создание звукового датчика с использованием Wi-Fi

cpp
#include <ESP8266WiFi.h> #define micPin A0 const char* ssid = "your_SSID"; const char* password = "your_PASSWORD"; void setup() { Serial.begin(9600); WiFi.begin(ssid, password); } void loop() { int soundLevel = analogRead(micPin); Serial.print("Уровень звука: "); Serial.println(soundLevel); delay(1000); }

Задание 5: Построение графика уровня звука на Serial Plotter

cpp
#define micPin A0 void setup() { Serial.begin(9600); } void loop() { int soundLevel = analogRead(micPin); Serial.println(soundLevel); delay(100); }

4.

СЕНСОР ШУМА (НАПРИМЕР, LM393)

Базовые задания

Задание 1: Измерение уровня шума

cpp
#define noisePin A0 void setup() { Serial.begin(9600); } void loop() { int noiseLevel = analogRead(noisePin); Serial.print("Уровень шума: "); Serial.println(noiseLevel); delay(1000); }

Задание 2: Включение светодиода при превышении порога шума

cpp
#define noisePin A0 #define ledPin 9 void setup() { Serial.begin(9600); pinMode(ledPin, OUTPUT); } void loop() { int noiseLevel = analogRead(noisePin); // Если уровень шума превышает порог, включаем светодиод if (noiseLevel > 512) { digitalWrite(ledPin, HIGH); } else { digitalWrite(ledPin, LOW); } Serial.print("Уровень шума: "); Serial.println(noiseLevel); delay(1000); }

Задание 3: Регистрация шумовых событий

cpp
#define noisePin A0 void setup() { Serial.begin(9600); } void loop() { int noiseLevel = analogRead(noisePin); // Регистрация шумового события if (noiseLevel > 512) { Serial.println("Шум обнаружен!"); } delay(1000); }

Задание 4: Измерение уровня шума и отображение на ЖК-дисплее

cpp
#include <LiquidCrystal.h> #define noisePin A0 LiquidCrystal lcd(12, 11, 5, 4, 3, 2); void setup() { Serial.begin(9600); lcd.begin(16, 2); } void loop() { int noiseLevel = analogRead(noisePin); lcd.clear(); lcd.print("Уровень шума: "); lcd.print(noiseLevel); delay(1000); }

Задание 5: Создание системы мониторинга шума с записью в файл

cpp
#include <SPI.h> #include <SD.h> #define noisePin A0 #define chipSelect 10 File dataFile; void setup() { Serial.begin(9600); SD.begin(chipSelect); dataFile = SD.open("noiseData.txt", FILE_WRITE); } void loop() { int noiseLevel = analogRead(noisePin); if (dataFile) { dataFile.println(noiseLevel); dataFile.flush(); } else { Serial.println("Ошибка открытия файла!"); } Serial.print("Уровень шума: "); Serial.println(noiseLevel); delay(1000); }

Сложные задания

Задание 1: Автоматизация вентиляции при высоком уровне шума

cpp
#define noisePin A0 #define fanPin 9 void setup() { Serial.begin(9600); pinMode(fanPin, OUTPUT); } void loop() { int noiseLevel = analogRead(noisePin); // Включаем вентилятор, если уровень шума слишком высокий if (noiseLevel > 512) { digitalWrite(fanPin, HIGH); } else { digitalWrite(fanPin, LOW); } Serial.print("Уровень шума: "); Serial.println(noiseLevel); delay(1000); }

Задание 2: Создание системы удаленного мониторинга уровня шума через Wi-Fi

cpp
#include <ESP8266WiFi.h> #define noisePin A0 const char* ssid = "your_SSID"; const char* password = "your_PASSWORD"; void setup() { Serial.begin(9600); WiFi.begin(ssid, password); } void loop() { int noiseLevel = analogRead(noisePin); Serial.print("Уровень шума: "); Serial.println(noiseLevel); delay(1000); }

Задание 5: Создание системы анализа данных о шуме и их визуализация на веб-странице

cpp
#include <ESP8266WebServer.h> #define noisePin A0 ESP8266WebServer server(80); void setup() { Serial.begin(9600); WiFi.begin("your_SSID", "your_PASSWORD"); server.on("/", HTTP_GET, []() { int noiseLevel = analogRead(noisePin); String message = "Уровень шума: " + String(noiseLevel); server.send(200, "text/plain", message); }); server.begin(); } void loop() { server.handleClient(); }

ChatGPT

1.

СЕНСОРЫ ДАВЛЕНИЯ (НАПРИМЕР, BMP180 ИЛИ BMP280)

Базовые задания

Задание 1: Измерение атмосферного давления

cpp
#include <Wire.h> #include <Adafruit_BMP280.h> Adafruit_BMP280 bmp; void setup() { Serial.begin(9600); if (!bmp.begin()) { Serial.println("Ошибка инициализации сенсора BMP280!"); while (1); } } void loop() { float pressure = bmp.readPressure() / 100.0F; // Перевод в гПа Serial.print("Давление: "); Serial.print(pressure); Serial.println(" гПа"); delay(1000); }

Задание 2: Вывод давления на ЖК-дисплей

cpp
#include <Wire.h> #include <Adafruit_BMP280.h> #include <LiquidCrystal.h> Adafruit_BMP280 bmp; LiquidCrystal lcd(12, 11, 5, 4, 3, 2); void setup() { Serial.begin(9600); lcd.begin(16, 2); if (!bmp.begin()) { lcd.print("Ошибка датчика"); while (1); } } void loop() { float pressure = bmp.readPressure() / 100.0F; lcd.clear(); lcd.print("Давление: "); lcd.print(pressure); lcd.print(" гПа"); delay(1000); }

Задание 3: Измерение температуры с помощью сенсора давления

cpp
#include <Wire.h> #include <Adafruit_BMP280.h> Adafruit_BMP280 bmp; void setup() { Serial.begin(9600); if (!bmp.begin()) { Serial.println("Ошибка инициализации BMP280!"); while (1); } } void loop() { float temperature = bmp.readTemperature(); Serial.print("Температура: "); Serial.print(temperature); Serial.println(" °C"); delay(1000); }

Задание 4: Вывод давления и температуры на OLED дисплей

cpp
#include <Wire.h> #include <Adafruit_BMP280.h> #include <Adafruit_SSD1306.h> Adafruit_BMP280 bmp; Adafruit_SSD1306 display(128, 64, &Wire, -1); void setup() { Serial.begin(9600); if (!bmp.begin()) { Serial.println("Ошибка сенсора!"); while (1); } display.begin(SSD1306_SWITCHCAPVCC, 0x3C); display.clearDisplay(); } void loop() { display.clearDisplay(); display.setTextSize(1); display.setCursor(0, 0); display.print("Давление: "); display.print(bmp.readPressure() / 100.0F); display.println(" гПа"); display.setCursor(0, 20); display.print("Температура: "); display.print(bmp.readTemperature()); display.println(" °C"); display.display(); delay(1000); }

Задание 5: Автоматическое включение вентилятора при высоком давлении

cpp
#include <Wire.h> #include <Adafruit_BMP280.h> Adafruit_BMP280 bmp; #define fanPin 9 void setup() { Serial.begin(9600); pinMode(fanPin, OUTPUT); if (!bmp.begin()) { Serial.println("Ошибка инициализации BMP280!"); while (1); } } void loop() { float pressure = bmp.readPressure() / 100.0F; if (pressure > 1015) { digitalWrite(fanPin, HIGH); // Включить вентилятор } else { digitalWrite(fanPin, LOW); // Выключить вентилятор } Serial.print("Давление: "); Serial.print(pressure); Serial.println(" гПа"); delay(1000); }

Сложные задания

Задание 1: Создание системы мониторинга атмосферного давления с историей данных

cpp
#include <Wire.h> #include <Adafruit_BMP280.h> #include <SD.h> Adafruit_BMP280 bmp; #define chipSelect 10 File dataFile; void setup() { Serial.begin(9600); if (!bmp.begin()) { Serial.println("Ошибка инициализации BMP280!"); while (1); } if (!SD.begin(chipSelect)) { Serial.println("Ошибка инициализации SD-карты!"); return; } dataFile = SD.open("pressureData.txt", FILE_WRITE); } void loop() { float pressure = bmp.readPressure() / 100.0F; if (dataFile) { dataFile.println(pressure); dataFile.flush(); } else { Serial.println("Ошибка записи файла!"); } Serial.print("Давление: "); Serial.print(pressure); Serial.println(" гПа"); delay(1000); }

Задание 2: Система прогнозирования погоды на основе данных о давлении

cpp
#include <Wire.h> #include <Adafruit_BMP280.h> Adafruit_BMP280 bmp; void setup() { Serial.begin(9600); if (!bmp.begin()) { Serial.println("Ошибка инициализации BMP280!"); while (1); } } void loop() { float pressure = bmp.readPressure() / 100.0F; if (pressure > 1020) { Serial.println("Ожидается хорошая погода."); } else if (pressure < 1000) { Serial.println("Возможны осадки."); } else { Serial.println("Погода стабильная."); } delay(1000); }

Задание 3: Визуализация атмосферного давления на веб-странице

cpp
#include <ESP8266WiFi.h> #include <Adafruit_BMP280.h> Adafruit_BMP280 bmp; ESP8266WebServer server(80); void setup() { Serial.begin(9600); WiFi.begin("your_SSID", "your_PASSWORD"); bmp.begin(); server.on("/", HTTP_GET, []() { float pressure = bmp.readPressure() / 100.0F; String message = "Давление: " + String(pressure) + " гПа"; server.send(200, "text/plain", message); }); server.begin(); } void loop() { server.handleClient(); }

Задание 4: Построение графика давления с использованием Excel через PLX-DAQ

cpp
#include <Wire.h> #include <Adafruit_BMP280.h> Adafruit_BMP280 bmp; void setup() { Serial.begin(9600); if (!bmp.begin()) { Serial.println("Ошибка инициализации BMP280!"); while (1); } Serial.println("LABEL,Pressure"); } void loop() { float pressure = bmp.readPressure() / 100.0F; Serial.print("DATA,TIME,"); Serial.println(pressure); delay(1000); }

Задание 5: Система управления дронами на основе высоты (используя барометрическое давление)

cpp
#include <Wire.h> #include <Adafruit_BMP280.h> Adafruit_BMP280 bmp; #define motorPin 9 void setup() { Serial.begin(9600); pinMode(motorPin, OUTPUT); if (!bmp.begin()) { Serial.println("Ошибка инициализации BMP280!"); while (1); } } void loop() { float altitude = bmp.readAltitude(); if (altitude > 50) { digitalWrite(motorPin, HIGH); // Включить мотор (дрон поднимается) } else { digitalWrite(motorPin, LOW); // Выключить мотор (дрон спускается) } Serial.print("Высота: "); Serial.print(altitude); Serial.println(" м"); delay(1000); }

2.

СЕНСОР УРОВНЯ ВОДЫ (НАПРИМЕР, ВОДЯНОЙ УРОВЕНЬ HL-69)

Базовые задания

Задание 1: Определение уровня воды

cpp
#define waterPin A0 void setup() { Serial.begin(9600); } void loop() { int waterLevel = analogRead(waterPin); Serial.print("Уровень воды: "); Serial.println(waterLevel); delay(1000); }

Задание 2: Определение критического уровня воды

cpp
#define waterPin A0 #define buzzerPin 9 void setup() { Serial.begin(9600); pinMode(buzzerPin, OUTPUT); } void loop() { int waterLevel = analogRead(waterPin); if (waterLevel > 700) { digitalWrite(buzzerPin, HIGH); // Включить сигнал тревоги } else { digitalWrite(buzzerPin, LOW); } Serial.print("Уровень воды: "); Serial.println(waterLevel); delay(1000); }

Задание 3: Автоматическое наполнение резервуара водой

cpp
#define waterPin A0 #define pumpPin 9 void setup() { Serial.begin(9600); pinMode(pumpPin, OUTPUT); } void loop() { int waterLevel = analogRead(waterPin); if (waterLevel < 300) { digitalWrite(pumpPin, HIGH); // Включить насос } else { digitalWrite(pumpPin, LOW); // Остановить насос } Serial.print("Уровень воды: "); Serial.println(waterLevel); delay(1000); }

Задание 4: Управление насосом через веб-интерфейс

cpp
#include <ESP8266WiFi.h> #define waterPin A0 #define pumpPin 9 ESP8266WebServer server(80); void setup() { Serial.begin(9600); pinMode(pumpPin, OUTPUT); WiFi.begin("your_SSID", "your_PASSWORD"); server.on("/", HTTP_GET, []() { int waterLevel = analogRead(waterPin); String message = "Уровень воды: " + String(waterLevel); server.send(200, "text/plain", message); }); server.begin(); } void loop() { server.handleClient(); }

Задание 5: Определение уровня воды с записью в SD-карту

cpp
#include <SD.h> #define waterPin A0 #define chipSelect 10 File dataFile; void setup() { Serial.begin(9600); SD.begin(chipSelect); dataFile = SD.open("waterLevel.txt", FILE_WRITE); } void loop() { int waterLevel = analogRead(waterPin); if (dataFile) { dataFile.println(waterLevel); dataFile.flush(); } else { Serial.println("Ошибка записи!"); } Serial.print("Уровень воды: "); Serial.println(waterLevel); delay(1000); }

Сложные задания

Задание 1: Автоматизация управления поливом на основе уровня воды

cpp
#define waterPin A0 #define valvePin 9 void setup() { Serial.begin(9600); pinMode(valvePin, OUTPUT); } void loop() { int waterLevel = analogRead(waterPin); if (waterLevel < 400) { digitalWrite(valvePin, HIGH); // Открыть клапан для полива } else { digitalWrite(valvePin, LOW); // Закрыть клапан } Serial.print("Уровень воды: "); Serial.println(waterLevel); delay(1000); }

Задание 2: Уведомления о низком уровне воды через Telegram

cpp
#include <WiFiClientSecure.h> #include <UniversalTelegramBot.h> #define waterPin A0 const char* ssid = "your_SSID"; const char* password = "your_PASSWORD"; const char* botToken = "your_BOT_TOKEN"; const char* chatId = "your_CHAT_ID"; WiFiClientSecure client; UniversalTelegramBot bot(botToken, client); void setup() { Serial.begin(9600); WiFi.begin(ssid, password); client.setInsecure(); } void loop() { int waterLevel = analogRead(waterPin); if (waterLevel < 300) { bot.sendMessage(chatId, "Низкий уровень воды!", ""); } Serial.print("Уровень воды: "); Serial.println(waterLevel); delay(1000); }

Задание 3: Контроль уровня воды с отображением на графике

cpp
#include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27, 16, 2); #define waterPin A0 void setup() { Serial.begin(9600); lcd.begin(); lcd.backlight(); } void loop() { int waterLevel = analogRead(waterPin); lcd.clear(); lcd.print("Уровень воды: "); lcd.setCursor(0, 1); lcd.print(waterLevel); delay(1000); }

Задание 4: Система сбора и анализа данных о воде

cpp
#include <ESP8266WiFi.h> #define waterPin A0 ESP8266WebServer server(80); void setup() { Serial.begin(9600); WiFi.begin("your_SSID", "your_PASSWORD"); server.on("/", HTTP_GET, []() { int waterLevel = analogRead(waterPin); String message = "Уровень воды: " + String(waterLevel); server.send(200, "text/plain", message); }); server.begin(); } void loop() { server.handleClient(); }

Задание 5: Управление системой водоснабжения через мобильное приложение

cpp
#include <ESP8266WiFi.h> #include <ESP8266WebServer.h> #define waterPin A0 #define pumpPin 9 ESP8266WebServer server(80); void setup() { Serial.begin(9600); pinMode(pumpPin, OUTPUT); WiFi.begin("your_SSID", "your_PASSWORD"); server.on("/", HTTP_GET, []() { String message = "Уровень воды: " + String(analogRead(waterPin)); server.send(200, "text/plain", message); }); server.on("/pumpOn", HTTP_GET, []() { digitalWrite(pumpPin, HIGH); server.send(200, "text/plain", "Насос включен"); }); server.on("/pumpOff", HTTP_GET, []() { digitalWrite(pumpPin, LOW); server.send(200, "text/plain", "Насос выключен"); }); server.begin(); } void loop() { server.handleClient(); }

ChatGPT

1.

АНЕМОМЕТР (СЕНСОР СКОРОСТИ ВЕТРА)

Базовые задания

Задание 1: Измерение скорости ветра и вывод в Serial Monitor

cpp
#define windPin 2 volatile int windCount = 0; unsigned long lastMillis = 0; void countWind() { windCount++; } void setup() { Serial.begin(9600); attachInterrupt(digitalPinToInterrupt(windPin), countWind, RISING); } void loop() { unsigned long currentMillis = millis(); if (currentMillis - lastMillis >= 1000) { float windSpeed = (windCount / 2.0) * 2.4; // 2 импульса = 1 вращение, 2.4 м/с на каждое вращение Serial.print("Скорость ветра: "); Serial.print(windSpeed); Serial.println(" м/с"); windCount = 0; lastMillis = currentMillis; } }

Задание 2: Включение светодиода при сильном ветре

cpp
#define windPin 2 #define ledPin 9 volatile int windCount = 0; unsigned long lastMillis = 0; void countWind() { windCount++; } void setup() { Serial.begin(9600); pinMode(ledPin, OUTPUT); attachInterrupt(digitalPinToInterrupt(windPin), countWind, RISING); } void loop() { unsigned long currentMillis = millis(); if (currentMillis - lastMillis >= 1000) { float windSpeed = (windCount / 2.0) * 2.4; Serial.print("Скорость ветра: "); Serial.print(windSpeed); Serial.println(" м/с"); if (windSpeed > 10) { digitalWrite(ledPin, HIGH); } else { digitalWrite(ledPin, LOW); } windCount = 0; lastMillis = currentMillis; } }

Задание 3: Вывод скорости ветра на ЖК-дисплей

cpp
#include <LiquidCrystal.h> #define windPin 2 volatile int windCount = 0; unsigned long lastMillis = 0; LiquidCrystal lcd(12, 11, 5, 4, 3, 2); void countWind() { windCount++; } void setup() { lcd.begin(16, 2); attachInterrupt(digitalPinToInterrupt(windPin), countWind, RISING); } void loop() { unsigned long currentMillis = millis(); if (currentMillis - lastMillis >= 1000) { float windSpeed = (windCount / 2.0) * 2.4; lcd.clear(); lcd.print("Скорость ветра:"); lcd.setCursor(0, 1); lcd.print(windSpeed); lcd.print(" м/с"); windCount = 0; lastMillis = currentMillis; } }

Задание 4: Сохранение данных о скорости ветра на SD-карту

cpp
#include <SD.h> #define windPin 2 volatile int windCount = 0; unsigned long lastMillis = 0; File dataFile; void countWind() { windCount++; } void setup() { Serial.begin(9600); SD.begin(10); attachInterrupt(digitalPinToInterrupt(windPin), countWind, RISING); dataFile = SD.open("windData.txt", FILE_WRITE); } void loop() { unsigned long currentMillis = millis(); if (currentMillis - lastMillis >= 1000) { float windSpeed = (windCount / 2.0) * 2.4; if (dataFile) { dataFile.println(windSpeed); dataFile.flush(); } Serial.print("Скорость ветра: "); Serial.println(windSpeed); windCount = 0; lastMillis = currentMillis; } }

Задание 5: Автоматическое закрытие окон при сильном ветре

cpp
#define windPin 2 #define motorPin 9 volatile int windCount = 0; unsigned long lastMillis = 0; void countWind() { windCount++; } void setup() { Serial.begin(9600); pinMode(motorPin, OUTPUT); attachInterrupt(digitalPinToInterrupt(windPin), countWind, RISING); } void loop() { unsigned long currentMillis = millis(); if (currentMillis - lastMillis >= 1000) { float windSpeed = (windCount / 2.0) * 2.4; Serial.print("Скорость ветра: "); Serial.println(windSpeed); if (windSpeed > 15) { digitalWrite(motorPin, HIGH); // Закрыть окна } else { digitalWrite(motorPin, LOW); // Оставить окна открытыми } windCount = 0; lastMillis = currentMillis; } }

Сложные задания

Задание 1: Визуализация данных скорости ветра на графике в реальном времени через веб-интерфейс

cpp
#include <ESP8266WiFi.h> #include <ESP8266WebServer.h> #define windPin 2 volatile int windCount = 0; unsigned long lastMillis = 0; ESP8266WebServer server(80); void countWind() { windCount++; } void setup() { Serial.begin(9600); WiFi.begin("your_SSID", "your_PASSWORD"); attachInterrupt(digitalPinToInterrupt(windPin), countWind, RISING); server.on("/", HTTP_GET, []() { float windSpeed = (windCount / 2.0) * 2.4; String message = "Скорость ветра: " + String(windSpeed) + " м/с"; server.send(200, "text/plain", message); windCount = 0; }); server.begin(); } void loop() { server.handleClient(); }

Задание 2: Уведомления о сильном ветре через Telegram

cpp
#include <WiFiClientSecure.h> #include <UniversalTelegramBot.h> #define windPin 2 const char* ssid = "your_SSID"; const char* password = "your_PASSWORD"; const char* botToken = "your_BOT_TOKEN"; const char* chatId = "your_CHAT_ID"; WiFiClientSecure client; UniversalTelegramBot bot(botToken, client); volatile int windCount = 0; unsigned long lastMillis = 0; void countWind() { windCount++; } void setup() { Serial.begin(9600); WiFi.begin(ssid, password); client.setInsecure(); attachInterrupt(digitalPinToInterrupt(windPin), countWind, RISING); } void loop() { unsigned long currentMillis = millis(); if (currentMillis - lastMillis >= 1000) { float windSpeed = (windCount / 2.0) * 2.4; if (windSpeed > 15) { bot.sendMessage(chatId, "Сильный ветер: " + String(windSpeed) + " м/с", ""); } windCount = 0; lastMillis = currentMillis; } }

Задание 3: Построение графика скорости ветра с использованием PLX-DAQ и Excel

cpp
#include <Wire.h> #define windPin 2 volatile int windCount = 0; unsigned long lastMillis = 0; void countWind() { windCount++; } void setup() { Serial.begin(9600); attachInterrupt(digitalPinToInterrupt(windPin), countWind, RISING); Serial.println("LABEL,Speed"); } void loop() { unsigned long currentMillis = millis(); if (currentMillis - lastMillis >= 1000) { float windSpeed = (windCount / 2.0) * 2.4; Serial.print("DATA,TIME,"); Serial.println(windSpeed); windCount = 0; lastMillis = currentMillis; } }

Задание 4: Автоматизация управления генератором на основе силы ветра

cpp
#define windPin 2 #define generatorPin 9 volatile int windCount = 0; unsigned long lastMillis = 0; void countWind() { windCount++; } void setup() { Serial.begin(9600); pinMode(generatorPin, OUTPUT); attachInterrupt(digitalPinToInterrupt(windPin), countWind, RISING); } void loop() { unsigned long currentMillis = millis(); if (currentMillis - lastMillis >= 1000) { float windSpeed = (windCount / 2.0) * 2.4; Serial.print("Скорость ветра: "); Serial.println(windSpeed); if (windSpeed > 12) { digitalWrite(generatorPin, HIGH); // Включить генератор } else { digitalWrite(generatorPin, LOW); // Остановить генератор } windCount = 0; lastMillis = currentMillis; } }

Задание 5: Прогнозирование погоды на основе анализа ветровых данных

2.

СЕНСОР ДЛЯ ИЗМЕРЕНИЯ ОСАДКОВ

Базовые задания

Задание 1: Измерение осадков и вывод в Serial Monitor

cpp
#define rainPin A0 void setup() { Serial.begin(9600); } void loop() { int rainValue = analogRead(rainPin); Serial.print("Осадки: "); Serial.println(rainValue); delay(1000); }

Базовые задания

Задание 2: Сигнализация при сильных осадках

cpp
#define rainPin A0 #define ledPin 9 void setup() { Serial.begin(9600); pinMode(ledPin, OUTPUT); } void loop() { int rainValue = analogRead(rainPin); Serial.print("Осадки: "); Serial.println(rainValue); if (rainValue > 700) { digitalWrite(ledPin, HIGH); // Сильные осадки — включить светодиод } else { digitalWrite(ledPin, LOW); // Осадки незначительны } delay(1000); }

Задание 3: Отображение уровня осадков на ЖК-дисплее

cpp
#include <LiquidCrystal.h> #define rainPin A0 LiquidCrystal lcd(12, 11, 5, 4, 3, 2); void setup() { lcd.begin(16, 2); } void loop() { int rainValue = analogRead(rainPin); lcd.clear(); lcd.print("Осадки: "); lcd.setCursor(0, 1); lcd.print(rainValue); delay(1000); }

Задание 4: Запись данных об осадках на SD-карту

cpp
#include <SD.h> #define rainPin A0 #define chipSelect 10 File dataFile; void setup() { Serial.begin(9600); SD.begin(chipSelect); dataFile = SD.open("rainData.txt", FILE_WRITE); } void loop() { int rainValue = analogRead(rainPin); if (dataFile) { dataFile.println(rainValue); dataFile.flush(); } Serial.print("Осадки: "); Serial.println(rainValue); delay(1000); }

Задание 5: Включение водоотвода при обнаружении сильных осадков

cpp
#define rainPin A0 #define pumpPin 9 void setup() { Serial.begin(9600); pinMode(pumpPin, OUTPUT); } void loop() { int rainValue = analogRead(rainPin); Serial.print("Осадки: "); Serial.println(rainValue); if (rainValue > 800) { digitalWrite(pumpPin, HIGH); // Включить насос } else { digitalWrite(pumpPin, LOW); // Остановить насос } delay(1000); }

Сложные задания

Задание 1: Визуализация данных об осадках в реальном времени через веб-интерфейс

cpp
#include <ESP8266WiFi.h> #include <ESP8266WebServer.h> #define rainPin A0 ESP8266WebServer server(80); void setup() { Serial.begin(9600); WiFi.begin("your_SSID", "your_PASSWORD"); server.on("/", HTTP_GET, []() { int rainValue = analogRead(rainPin); String message = "Уровень осадков: " + String(rainValue); server.send(200, "text/plain", message); }); server.begin(); } void loop() { server.handleClient(); }

Задание 2: Уведомления о сильных осадках через Telegram

cpp
#include <WiFiClientSecure.h> #include <UniversalTelegramBot.h> #define rainPin A0 const char* ssid = "your_SSID"; const char* password = "your_PASSWORD"; const char* botToken = "your_BOT_TOKEN"; const char* chatId = "your_CHAT_ID"; WiFiClientSecure client; UniversalTelegramBot bot(botToken, client); void setup() { Serial.begin(9600); WiFi.begin(ssid, password); client.setInsecure(); } void loop() { int rainValue = analogRead(rainPin); if (rainValue > 800) { bot.sendMessage(chatId, "Сильные осадки обнаружены!", ""); } delay(10000); // Отправлять уведомление каждые 10 секунд }

Задание 3: Анализ долгосрочных данных об осадках с записью на сервер

cpp
#include <ESP8266WiFi.h> #include <ESP8266HTTPClient.h> #define rainPin A0 const char* ssid = "your_SSID"; const char* password = "your_PASSWORD"; const char* serverName = "http://your-server.com/upload"; void setup() { Serial.begin(9600); WiFi.begin(ssid, password); } void loop() { if (WiFi.status() == WL_CONNECTED) { HTTPClient http; http.begin(serverName); int rainValue = analogRead(rainPin); String postData = "rainValue=" + String(rainValue); http.POST(postData); http.end(); } delay(60000); // Отправлять данные каждую минуту }

Задание 4: Автоматическое управление крышами для защиты от дождя

cpp
#define rainPin A0 #define motorPin 9 void setup() { Serial.begin(9600); pinMode(motorPin, OUTPUT); } void loop() { int rainValue = analogRead(rainPin); if (rainValue > 800) { digitalWrite(motorPin, HIGH); // Закрыть крышу } else { digitalWrite(motorPin, LOW); // Открыть крышу } delay(1000); }

3.

АКСЕЛЕРОМЕТР + ГИРОСКОП

Базовые задания

Задание 1: Определение положения устройства (акселерометр)

cpp
#include <Wire.h> #include <Adafruit_MPU6050.h> #include <Adafruit_Sensor.h> Adafruit_MPU6050 mpu; void setup() { Serial.begin(115200); if (!mpu.begin()) { Serial.println("Не удалось найти MPU6050"); while (1); } } void loop() { sensors_event_t a, g, temp; mpu.getEvent(&a, &g, &temp); Serial.print("Ускорение X: "); Serial.println(a.acceleration.x); Serial.print("Ускорение Y: "); Serial.println(a.acceleration.y); Serial.print("Ускорение Z: "); Serial.println(a.acceleration.z); delay(500); }

Задание 2: Обнаружение падения

cpp
#include <Wire.h> #include <Adafruit_MPU6050.h> #include <Adafruit_Sensor.h> Adafruit_MPU6050 mpu; void setup() { Serial.begin(115200); if (!mpu.begin()) { Serial.println("Не удалось найти MPU6050"); while (1); } } void loop() { sensors_event_t a, g, temp; mpu.getEvent(&a, &g, &temp); float totalAcceleration = sqrt(sq(a.acceleration.x) + sq(a.acceleration.y) + sq(a.acceleration.z)); if (totalAcceleration > 20) { // Если ускорение слишком высокое, возможно падение Serial.println("Обнаружено падение!"); } delay(100); }

Задание 3: Измерение углов вращения (гироскоп)

cpp
#include <Wire.h> #include <Adafruit_MPU6050.h> #include <Adafruit_Sensor.h> Adafruit_MPU6050 mpu; void setup() { Serial.begin(115200); if (!mpu.begin()) { Serial.println("Не удалось найти MPU6050"); while (1); } } void loop() { sensors_event_t a, g, temp; mpu.getEvent(&a, &g, &temp); Serial.print("Угловая скорость X: "); Serial.println(g.gyro.x); Serial.print("Угловая скорость Y: "); Serial.println(g.gyro.y); Serial.print("Угловая скорость Z: "); Serial.println(g.gyro.z); delay(500); }

Задание 4: Использование акселерометра и гироскопа для контроля поворотов робота

cpp
#include <Wire.h> #include <Adafruit_MPU6050.h> #include <Adafruit_Sensor.h> Adafruit_MPU6050 mpu; void setup() { Serial.begin(115200); if (!mpu.begin()) { Serial.println("Не удалось найти MPU6050"); while (1); } } void loop() { sensors_event_t a, g, temp; mpu.getEvent(&a, &g, &temp); // Простой контроль поворотов: если робот наклонен в сторону, выполнить поворот if (g.gyro.x > 1) { Serial.println("Поворот направо"); } else if (g.gyro.x < -1) { Serial.println("Поворот налево"); } delay(500); }

4.

ВИБРАЦИОННЫЙ ДАТЧИК

Базовые задания

Задание 1: Обнаружение вибрации и вывод в Serial Monitor

cpp
#define vibPin 2 void setup() { Serial.begin(9600); pinMode(vibPin, INPUT); } void loop() { int vibValue = digitalRead(vibPin); Serial.print("Вибрация: "); Serial.println(vibValue); delay(1000); }

Задание 2: Включение светодиода при обнаружении вибрации

cpp
#define vibPin 2 #define ledPin 9 void setup() { Serial.begin(9600); pinMode(vibPin, INPUT); pinMode(ledPin, OUTPUT); } void loop() { int vibValue = digitalRead(vibPin); if (vibValue == HIGH) { digitalWrite(ledPin, HIGH); // Включить светодиод } else { digitalWrite(ledPin, LOW); // Выключить светодиод } delay(100); }

Задание 3: Подсчет количества вибраций за определенный период времени

cpp
#define vibPin 2 int count = 0; void setup() { Serial.begin(9600); pinMode(vibPin, INPUT); } void loop() { if (digitalRead(vibPin) == HIGH) { count++; delay(100); // Убеждаемся, что мы не считаем одну и ту же вибрацию несколько раз } Serial.print("Количество вибраций: "); Serial.println(count); delay(1000); }

Задание 4: Отправка данных о вибрации на сервер

cpp
#include <WiFiClient.h> #include <ESP8266WiFi.h> #define vibPin 2 const char* ssid = "your_SSID"; const char* password = "your_PASSWORD"; const char* server = "http://your-server.com/submit"; void setup() { Serial.begin(9600); pinMode(vibPin, INPUT); WiFi.begin(ssid, password); } void loop() { if (WiFi.status() == WL_CONNECTED) { if (digitalRead(vibPin) == HIGH) { WiFiClient client; client.connect(server, 80); client.println("POST /submit HTTP/1.1"); client.println("Host: your-server.com"); client.println("Connection: close"); client.println(); } } delay(1000); }

Задание 5: Включение сигнализации при обнаружении вибрации

cpp
#define vibPin 2 #define buzzerPin 9 void setup() { Serial.begin(9600); pinMode(vibPin, INPUT); pinMode(buzzerPin, OUTPUT); } void loop() { if (digitalRead(vibPin) == HIGH) { digitalWrite(buzzerPin, HIGH); // Включить сигнализацию delay(1000); digitalWrite(buzzerPin, LOW); // Выключить сигнализацию } delay(100); }

Сложные задания

Задание 1: Система мониторинга вибрации для оборудования

Создание системы, которая будет отслеживать вибрации на оборудовании и отправлять уведомления при превышении определенных значений.

Задание 2: Адаптивный контроль за состоянием конструкции (например, мост)

Разработка системы, которая будет контролировать вибрации в конструкции моста и сигнализировать об аномалиях.

5.

СЕНСОР ВЛАЖНОСТИ ПОЧВЫ

Базовые задания

Задание 1: Измерение влажности почвы и вывод в Serial Monitor

cpp
#define soilMoisturePin A0 void setup() { Serial.begin(9600); } void loop() { int moistureValue = analogRead(soilMoisturePin); Serial.print("Влажность почвы: "); Serial.println(moistureValue); delay(1000); }

Задание 2: Включение полива при низкой влажности почвы

cpp
#define soilMoisturePin A0 #define pumpPin 9 void setup() { Serial.begin(9600); pinMode(pumpPin, OUTPUT); } void loop() { int moistureValue = analogRead(soilMoisturePin); if (moistureValue < 300) { // Порог влажности digitalWrite(pumpPin, HIGH); // Включить насос } else { digitalWrite(pumpPin, LOW); // Выключить насос } delay(1000); }

Задание 3: Отображение уровня влажности на ЖК-дисплее

cpp
#include <LiquidCrystal.h> #define soilMoisturePin A0 LiquidCrystal lcd(12, 11, 5, 4, 3, 2); void setup() { lcd.begin(16, 2); } void loop() { int moistureValue = analogRead(soilMoisturePin); lcd.clear(); lcd.print("Влажность: "); lcd.setCursor(0, 1); lcd.print(moistureValue); delay(1000); }

Задание 4: Запись данных о влажности на SD-карту

cpp
#include <SD.h> #define soilMoisturePin A0 #define chipSelect 10 File dataFile; void setup() { Serial.begin(9600); SD.begin(chipSelect); dataFile = SD.open("moistureData.txt", FILE_WRITE); } void loop() { int moistureValue = analogRead(soilMoisturePin); if (dataFile) { dataFile.println(moistureValue); dataFile.flush(); } Serial.print("Влажность почвы: "); Serial.println(moistureValue); delay(1000); }

Задание 5: Уведомление о низкой влажности почвы через SMS

cpp
#include <SoftwareSerial.h> #define soilMoisturePin A0 SoftwareSerial sim800(7, 8); // RX, TX void setup() { Serial.begin(9600); sim800.begin(9600); } void loop() { int moistureValue = analogRead(soilMoisturePin); if (moistureValue < 300) { sim800.println("AT+CMGS=\"your_number\""); // Замените на ваш номер delay(100); sim800.println("Внимание! Низкая влажность почвы!"); delay(100); sim800.write(26); // Ctrl+Z для отправки сообщения } delay(10000); }

Сложные задания

Задание 1: Умная система полива на основе влажности почвы и метеоусловий

Создание системы, которая автоматически регулирует полив в зависимости от влажности почвы и погодных условий.

Задание 2: Мониторинг и анализ влажности почвы в режиме реального времени через веб-интерфейс

Разработка системы, которая отображает данные о влажности почвы в реальном времени через веб-интерфейс.

На этом этапе я закончил с заданиями по всем упомянутым сенсорам. Если есть другие запросы или дополнительные детали, которые нужно проработать, дайте знать!

Сенсоры пульса и кислорода MAX30100: сенсор для измерения пульса и кислорода в крови. MAX30102: улучшенная версия MAX30100. Сенсоры объема и массы HX711: модуль для весов, работающий с тензодатчиками. Потенциометры: для измерения угла поворота. Сенсоры для мониторинга окружающей среды SDS011: сенсор для измерения качества воздуха и PM2.5/PM10 частиц. MH-Z19: сенсор CO2 для измерения углекислого газа в воздухе. Сенсоры давления воды MPX5010: сенсор для измерения давления в жидкости. MS5803: барометрический сенсор для измерения давления воды. Сенсоры для контроля электросети ACS712: датчик тока для измерения потребляемой мощности. ZMPT101B: сенсор для измерения переменного напряжения. Сенсоры для распознавания объектов HC-SR04: ультразвуковой сенсор для измерения расстояния. VL53L0X: лазерный сенсор расстояния. Сенсоры вращения TACHOMETER: сенсор для измерения угловой скорости. Сенсоры для управления RC-сервомодули: для управления сервомоторами. Модуль реле: для управления высоковольтными устройствами. Сенсоры для мониторинга состояния почвы Сенсор влажности почвы: для определения уровня влажности в почве. Сенсор pH почвы: для измерения кислотности почвы. Различные сенсоры TCS34725: сенсор цвета с RGB. AS7341: многоканальный сенсор цвета. MLX90640: сенсор для измерения температуры с помощью инфракрасного излучения. Сенсоры для роботов Датчики касания: для определения контакта с объектами. Сенсоры для отслеживания линии: используются в роботах для следования по линиям. Сенсоры для анализа данных NFC/RFID-сенсоры: для считывания информации с RFID-меток. GPIO-расширители: для увеличения числа доступных портов. Аудио и визуальные сенсоры CCD-матрицы: для захвата изображений. Модуль RGB-светодиодов: для управления цветами и светом. Дополнительные сенсоры Сенсоры обострения (tilt sensors): для определения наклона. Сенсоры водонепроницаемости: для работы в условиях повышенной влажности.
ChatGPT

1.

СЕНСОРЫ ПУЛЬСА И КИСЛОРОДА (MAX30100/MAX30102)

Базовые задания

Задание 1: Измерение пульса и уровня кислорода в крови

cpp
#include <Wire.h> #include "MAX30100_PulseOximeter.h" MAX30100_PulseOximeter pox; void setup() { Serial.begin(9600); pox.begin(); } void loop() { pox.update(); Serial.print("Пульс: "); Serial.print(pox.getHeartRate()); Serial.print(" bpm, Уровень кислорода: "); Serial.print(pox.getSpO2()); Serial.println(" %"); delay(1000); }

Задание 2: Подсчет пульса за определенный период

cpp
#include <Wire.h> #include "MAX30100_PulseOximeter.h" MAX30100_PulseOximeter pox; void setup() { Serial.begin(9600); pox.begin(); } void loop() { pox.update(); int heartRate = pox.getHeartRate(); Serial.print("Пульс: "); Serial.println(heartRate); delay(5000); }

Задание 3: Визуализация данных на ЖК-дисплее

cpp
#include <LiquidCrystal.h> #include <Wire.h> #include "MAX30100_PulseOximeter.h" MAX30100_PulseOximeter pox; LiquidCrystal lcd(12, 11, 5, 4, 3, 2); void setup() { lcd.begin(16, 2); pox.begin(); } void loop() { pox.update(); lcd.clear(); lcd.print("HR: "); lcd.print(pox.getHeartRate()); lcd.setCursor(0, 1); lcd.print("SpO2: "); lcd.print(pox.getSpO2()); delay(1000); }

Задание 4: Отправка данных на сервер через WiFi

cpp
#include <WiFi.h> #include <Wire.h> #include "MAX30100_PulseOximeter.h" const char* ssid = "your_SSID"; const char* password = "your_PASSWORD"; const char* server = "http://your-server.com/submit"; MAX30100_PulseOximeter pox; void setup() { Serial.begin(9600); pox.begin(); WiFi.begin(ssid, password); } void loop() { pox.update(); if (WiFi.status() == WL_CONNECTED) { // Отправка данных на сервер WiFiClient client; client.connect(server, 80); client.print("GET /submit?hr="); client.print(pox.getHeartRate()); client.print("&spo2="); client.print(pox.getSpO2()); client.println(" HTTP/1.1"); } delay(10000); }

Задание 5: Аудиоуведомление при низком уровне кислорода

cpp
#include <Wire.h> #include "MAX30100_PulseOximeter.h" #define buzzerPin 9 MAX30100_PulseOximeter pox; void setup() { Serial.begin(9600); pinMode(buzzerPin, OUTPUT); pox.begin(); } void loop() { pox.update(); if (pox.getSpO2() < 90) { digitalWrite(buzzerPin, HIGH); // Включить сигнал } else { digitalWrite(buzzerPin, LOW); // Выключить сигнал } delay(1000); }

Сложные задания

Задание 1: Умное устройство для мониторинга состояния здоровья

Создание устройства, которое отслеживает пульс и уровень кислорода и отправляет уведомления на телефон, если значения выходят за пределы нормы.

Задание 2: Анализ данных о пульсе и кислороде в реальном времени

Разработка приложения для отображения данных в реальном времени с использованием графиков и истории изменений.

2.

СЕНСОРЫ ОБЪЕМА И МАССЫ (HX711)

Базовые задания

Задание 1: Измерение массы с использованием HX711

cpp
#include "HX711.h" HX711 scale; void setup() { Serial.begin(9600); scale.begin(3, 2); // DT, SCK scale.set_scale(2280.f); // Установите калибровочный коэффициент } void loop() { Serial.print("Масса: "); Serial.print(scale.get_units(10), 1); Serial.println(" g"); delay(1000); }

Задание 2: Калибровка весов

cpp
#include "HX711.h" HX711 scale; void setup() { Serial.begin(9600); scale.begin(3, 2); Serial.println("Калибровка весов..."); scale.set_scale(); // Установить калибровочный коэффициент } void loop() { Serial.print("Масса: "); Serial.print(scale.get_units(10), 1); Serial.println(" g"); delay(1000); }

Задание 3: Автоматическое выключение при отсутствии нагрузки

cpp
#include "HX711.h" HX711 scale; void setup() { Serial.begin(9600); scale.begin(3, 2); } void loop() { if (scale.get_units(10) == 0) { Serial.println("Выключение весов..."); // Здесь можно добавить код для отключения питания } delay(1000); }

Задание 4: Сохранение данных о весе на SD-карту

cpp
#include <SD.h> #include "HX711.h" HX711 scale; #define chipSelect 10 File dataFile; void setup() { Serial.begin(9600); SD.begin(chipSelect); scale.begin(3, 2); dataFile = SD.open("weights.txt", FILE_WRITE); } void loop() { float weight = scale.get_units(10); if (dataFile) { dataFile.println(weight); dataFile.flush(); } delay(1000); }

Задание 5: Сигнализация при превышении веса

cpp
#include "HX711.h" HX711 scale; #define buzzerPin 9 void setup() { Serial.begin(9600); pinMode(buzzerPin, OUTPUT); scale.begin(3, 2); } void loop() { if (scale.get_units(10) > 1000) { // Порог превышения digitalWrite(buzzerPin, HIGH); // Включить сигнал } else { digitalWrite(buzzerPin, LOW); // Выключить сигнал } delay(1000); }

Сложные задания

Задание 1: Умные весы с отправкой данных в облако

Создание системы, которая будет отправлять данные о весе на облачный сервис для дальнейшего анализа.

Задание 2: Контроль массы для автоматизированной системы упаковки

Разработка системы, которая будет автоматически упаковывать товары в зависимости от их массы.

3.

ПОТЕНЦИОМЕТРЫ

Базовые задания

Задание 1: Измерение угла поворота потенциометра

cpp
#define potPin A0 void setup() { Serial.begin(9600); } void loop() { int potValue = analogRead(potPin); Serial.print("Угол: "); Serial.println(map(potValue, 0, 1023, 0, 360)); // Преобразование в угол delay(1000); }

Задание 2: Установка яркости светодиода в зависимости от угла поворота

cpp
#define potPin A0 #define ledPin 9 void setup() { pinMode(ledPin, OUTPUT); } void loop() { int potValue = analogRead(potPin); analogWrite(ledPin, map(potValue, 0, 1023, 0, 255)); delay(100); }

Задание 3: Установка скорости вращения мотора в зависимости от угла

cpp
#define potPin A0 #define motorPin 9 void setup() { pinMode(motorPin, OUTPUT); } void loop() { int potValue = analogRead(potPin); analogWrite(motorPin, map(potValue, 0, 1023, 0, 255)); delay(100); }

Задание 4: Установка звука в зависимости от угла поворота

cpp
#include <Tone.h> #define potPin A0 #define speakerPin 9 Tone tone; void setup() { tone.begin(speakerPin); } void loop() { int potValue = analogRead(potPin); tone.setFrequency(map(potValue, 0, 1023, 100, 1000)); delay(100); }

Задание 5: Создание графического интерфейса для управления потенциометром

cpp
// Код для создания графического интерфейса на компьютере, например, с использованием Processing.

Сложные задания

Задание 1: Диммер для управления яркостью света

Создание устройства, которое регулирует яркость света в зависимости от положения потенциометра.

Задание 2: Контроль угла поворота сервомотора с использованием потенциометра

Разработка системы, в которой угол поворота сервомотора зависит от положения потенциометра.

4.

СЕНСОРЫ ДЛЯ МОНИТОРИНГА ОКРУЖАЮЩЕЙ СРЕДЫ (SDS011, MH-Z19)

Базовые задания

Задание 1: Измерение качества воздуха с помощью SDS011

cpp
#include <SoftwareSerial.h> #include "SDS011.h" SDS011 sds011(2, 3); // RX, TX void setup() { Serial.begin(9600); sds011.begin(); } void loop() { float pm25, pm10; sds011.read(&pm25, &pm10); Serial.print("PM2.5: "); Serial.print(pm25); Serial.print(" µg/m³, PM10: "); Serial.print(pm10); Serial.println(" µg/m³"); delay(1000); }

Задание 2: Измерение уровня CO2 с помощью MH-Z19

cpp
#include <SoftwareSerial.h> #include "MHZ19.h" MHZ19 myMHZ19; void setup() { Serial.begin(9600); myMHZ19.begin(); } void loop() { int co2 = myMHZ19.getCO2(); Serial.print("CO2: "); Serial.print(co2); Serial.println(" ppm"); delay(1000); }

Задание 3: Отображение данных на ЖК-дисплее

cpp
#include <LiquidCrystal.h> #include <SoftwareSerial.h> #include "SDS011.h" #include "MHZ19.h" SDS011 sds011(2, 3); MHZ19 myMHZ19; LiquidCrystal lcd(12, 11, 5, 4, 3, 2); void setup() { lcd.begin(16, 2); sds011.begin(); myMHZ19.begin(); } void loop() { float pm25, pm10; sds011.read(&pm25, &pm10); int co2 = myMHZ19.getCO2(); lcd.clear(); lcd.print("PM2.5: "); lcd.print(pm25); lcd.setCursor(0, 1); lcd.print("CO2: "); lcd.print(co2); delay(1000); }

Задание 4: Отправка данных на сервер через WiFi

cpp
#include <WiFi.h> #include <SoftwareSerial.h> #include "SDS011.h" #include "MHZ19.h" const char* ssid = "your_SSID"; const char* password = "your_PASSWORD"; const char* server = "http://your-server.com/submit"; SDS011 sds011(2, 3); MHZ19 myMHZ19; void setup() { Serial.begin(9600); sds011.begin(); myMHZ19.begin(); WiFi.begin(ssid, password); } void loop() { float pm25, pm10; sds011.read(&pm25, &pm10); int co2 = myMHZ19.getCO2(); if (WiFi.status() == WL_CONNECTED) { WiFiClient client; client.connect(server, 80); client.print("GET /submit?pm25="); client.print(pm25); client.print("&pm10="); client.print(pm10); client.print("&co2="); client.print(co2); client.println(" HTTP/1.1"); } delay(10000); }

Задание 5: Аудиоуведомление при превышении уровня CO2

cpp
#include <SoftwareSerial.h> #include "MHZ19.h" #define buzzerPin 9 MHZ19 myMHZ19; void setup() { Serial.begin(9600); pinMode(buzzerPin, OUTPUT); myMHZ19.begin(); } void loop() { int co2 = myMHZ19.getCO2(); if (co2 > 1000) { digitalWrite(buzzerPin, HIGH); // Включить сигнал } else { digitalWrite(buzzerPin, LOW); // Выключить сигнал } delay(1000); }

Сложные задания

Задание 1: Умное устройство для мониторинга качества воздуха в помещении

Создание системы, которая отслеживает качество воздуха и отправляет уведомления на телефон, если уровень загрязняющих веществ превышает допустимые значения.

Задание 2: Система анализа данных о качестве воздуха в реальном времени

Разработка приложения, которое отображает данные о качестве воздуха в реальном времени с использованием графиков и истории изменений.

5.

СЕНСОРЫ ДАВЛЕНИЯ ВОДЫ (MPX5010, MS5803)

Базовые задания

Задание 1: Измерение давления воды с помощью MPX5010

cpp
#define pressurePin A0 void setup() { Serial.begin(9600); } void loop() { int pressureValue = analogRead(pressurePin); float pressure = (pressureValue / 1023.0) * 5.0; // Преобразование в вольты Serial.print("Давление: "); Serial.print(pressure); Serial.println(" V"); delay(1000); }

Задание 2: Измерение глубины воды

cpp
#define pressurePin A0 void setup() { Serial.begin(9600); } void loop() { int pressureValue = analogRead(pressurePin); float pressure = (pressureValue / 1023.0) * 5.0; // Преобразование в вольты float depth = pressure / 0.00981; // Преобразование давления в глубину (примерный расчет) Serial.print("Глубина: "); Serial.print(depth); Serial.println(" m"); delay(1000); }

Задание 3: Измерение давления с использованием MS5803

cpp
#include <Wire.h> #include "MS5803.h" MS5803 sensor; void setup() { Serial.begin(9600); sensor.begin(); } void loop() { float pressure = sensor.getPressure(); Serial.print("Давление: "); Serial.print(pressure); Serial.println(" mbar"); delay(1000); }

Задание 4: Отображение давления на ЖК-дисплее

cpp
#include <LiquidCrystal.h> #include <Wire.h> #include "MS5803.h" MS5803 sensor; LiquidCrystal lcd(12, 11, 5, 4, 3, 2); void setup() { lcd.begin(16, 2); sensor.begin(); } void loop() { float pressure = sensor.getPressure(); lcd.clear(); lcd.print("Давление: "); lcd.print(pressure); delay(1000); }

Задание 5: Сигнализация при высоком давлении

cpp
#include <Wire.h> #include "MS5803.h" #define buzzerPin 9 MS5803 sensor; void setup() { Serial.begin(9600); pinMode(buzzerPin, OUTPUT); sensor.begin(); } void loop() { float pressure = sensor.getPressure(); if (pressure > 1500) { // Порог давления digitalWrite(buzzerPin, HIGH); // Включить сигнал } else { digitalWrite(buzzerPin, LOW); // Выключить сигнал } delay(1000); }

Сложные задания

Задание 1: Система мониторинга уровня воды с использованием датчиков давления

Создание системы, которая отслеживает уровень воды и уведомляет о превышении определенных значений.

Задание 2: Автоматизированная система управления насосами на основе данных о давлении

Разработка системы, которая автоматически управляет насосами на основе данных о давлении воды.

6.

СЕНСОРЫ ДЛЯ КОНТРОЛЯ ЭЛЕКТРОСЕТИ (ACS712, ZMPT101B)

Базовые задания

Задание 1: Измерение тока с помощью ACS712

cpp
#include <ACS712.h> ACS712 sensor(ACS712_20A, A0); void setup() { Serial.begin(9600); } void loop() { float current = sensor.getCurrentAC(); Serial.print("Ток: "); Serial.print(current); Serial.println(" A"); delay(1000); }

Задание 2: Измерение напряжения с помощью ZMPT101B

cpp
#define voltagePin A0 void setup() { Serial.begin(9600); } void loop() { float voltage = analogRead(voltagePin) * (5.0 / 1023.0); // Преобразование в вольты Serial.print("Напряжение: "); Serial.print(voltage); Serial.println(" V"); delay(1000); }

Задание 3: Расчет мощности на основе измерений тока и напряжения

cpp
#include <ACS712.h> ACS712 currentSensor(ACS712_20A, A0); #define voltagePin A1 void setup() { Serial.begin(9600); } void loop() { float current = currentSensor.getCurrentAC(); float voltage = analogRead(voltagePin) * (5.0 / 1023.0); float power = voltage * current; Serial.print("Мощность: "); Serial.print(power); Serial.println(" W"); delay(1000); }

Задание 4: Отображение данных на ЖК-дисплее

cpp
#include <LiquidCrystal.h> #include <ACS712.h> ACS712 currentSensor(ACS712_20A, A0); #define voltagePin A1 LiquidCrystal lcd(12, 11, 5, 4, 3, 2); void setup() { lcd.begin(16, 2); } void loop() { float current = currentSensor.getCurrentAC(); float voltage = analogRead(voltagePin) * (5.0 / 1023.0); float power = voltage * current; lcd.clear(); lcd.print("P: "); lcd.print(power); delay(1000); }

Задание 5: Сигнализация при превышении мощности

cpp
#include <ACS712.h> #define buzzerPin 9 ACS712 currentSensor(ACS712_20A, A0); #define voltagePin A1 void setup() { Serial.begin(9600); pinMode(buzzerPin, OUTPUT); } void loop() { float current = currentSensor.getCurrentAC(); float voltage = analogRead(voltagePin) * (5.0 / 1023.0); float power = voltage * current; if (power > 1000) { // Порог мощности digitalWrite(buzzerPin, HIGH); // Включить сигнал } else { digitalWrite(buzzerPin, LOW); // Выключить сигнал } delay(1000); }

Сложные задания

Задание 1: Умная система управления энергопотреблением

Создание системы, которая отслеживает энергопотребление и управляет электроприборами.

Задание 2: Анализ энергопотребления с использованием данных о токе и напряжении

Разработка приложения для анализа данных о потреблении энергии с графическим интерфейсом.

7.

СЕНСОРЫ ДЛЯ РАСПОЗНАВАНИЯ ОБЪЕКТОВ (HC-SR04, VL53L0X)

Базовые задания

Задание 1: Измерение расстояния с помощью HC-SR04

cpp
#define trigPin 9 #define echoPin 10 void setup() { Serial.begin(9600); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); } void loop() { long duration, distance; digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); distance = duration * 0.034 / 2; // Преобразование в см Serial.print("Расстояние: "); Serial.print(distance); Serial.println(" cm"); delay(1000); }

Задание 2: Измерение расстояния с помощью VL53L0X

cpp
#include <Wire.h> #include <VL53L0X.h> VL53L0X sensor; void setup() { Serial.begin(9600); sensor.init(); sensor.setTimeout(500); } void loop() { int distance = sensor.readRangeSingleMillimeters(); Serial.print("Расстояние: "); Serial.print(distance); Serial.println(" mm"); delay(1000); }

Задание 3: Измерение расстояния и отображение данных на ЖК-дисплее

cpp
#include <Wire.h> #include <VL53L0X.h> #include <LiquidCrystal.h> VL53L0X sensor; LiquidCrystal lcd(12, 11, 5, 4, 3, 2); void setup() { lcd.begin(16, 2); sensor.init(); sensor.setTimeout(500); } void loop() { int distance = sensor.readRangeSingleMillimeters(); lcd.clear(); lcd.print("Dist: "); lcd.print(distance); delay(1000); }

Задание 4: Аудиосигнал при приближении объекта

cpp
#include <Wire.h> #include <VL53L0X.h> #define buzzerPin 9 VL53L0X sensor; void setup() { Serial.begin(9600); pinMode(buzzerPin, OUTPUT); sensor.init(); sensor.setTimeout(500); } void loop() { int distance = sensor.readRangeSingleMillimeters(); if (distance < 200) { // Порог приближения digitalWrite(buzzerPin, HIGH); // Включить сигнал } else { digitalWrite(buzzerPin, LOW); // Выключить сигнал } delay(1000); }

Задание 5: Управление светодиодом в зависимости от расстояния

cpp
#include <Wire.h> #include <VL53L0X.h> #define ledPin 9 VL53L0X sensor; void setup() { pinMode(ledPin, OUTPUT); sensor.init(); } void loop() { int distance = sensor.readRangeSingleMillimeters(); int brightness = map(distance, 0, 2000, 0, 255); analogWrite(ledPin, brightness); delay(100); }

Сложные задания

Задание 1: Робот с системой избегания препятствий

Создание робота, который использует сенсоры для избегания столкновений с объектами.

Задание 2: Умное устройство для мониторинга уровня воды

Разработка системы, которая будет контролировать уровень воды в резервуаре с использованием ультразвукового датчика.

8.

СЕНСОРЫ ВРАЩЕНИЯ (TACHOMETER)

Базовые задания

Задание 1: Измерение скорости вращения

cpp
#define tachometerPin 2 volatile int count = 0; void setup() { Serial.begin(9600); attachInterrupt(digitalPinToInterrupt(tachometerPin), countRpm, RISING); } void loop() { count = 0; delay(1000); // Измерение за 1 секунду Serial.print("RPM: "); Serial.println(count * 60); // Умножаем на 60 для получения оборотов в минуту } void countRpm() { count++; }

Задание 2: Отображение скорости вращения на ЖК-дисплее

cpp
#include <LiquidCrystal.h> #define tachometerPin 2 volatile int count = 0; LiquidCrystal lcd(12, 11, 5, 4, 3, 2); void setup() { lcd.begin(16, 2); attachInterrupt(digitalPinToInterrupt(tachometerPin), countRpm, RISING); } void loop() { count = 0; delay(1000); lcd.clear(); lcd.print("RPM: "); lcd.print(count * 60); } void countRpm() { count++; }

Задание 3: Сигнализация при превышении заданной скорости вращения

cpp
#define tachometerPin 2 #define buzzerPin 9 volatile int count = 0; void setup() { Serial.begin(9600); pinMode(buzzerPin, OUTPUT); attachInterrupt(digitalPinToInterrupt(tachometerPin), countRpm, RISING); } void loop() { count = 0; delay(1000); if (count * 60 > 3000) { // Порог скорости digitalWrite(buzzerPin, HIGH); // Включить сигнал } else { digitalWrite(buzzerPin, LOW); // Выключить сигнал } } void countRpm() { count++; }

Задание 4: Автоматическое регулирование скорости мотора

cpp
#define tachometerPin 2 #define motorPin 9 volatile int count = 0; void setup() { pinMode(motorPin, OUTPUT); attachInterrupt(digitalPinToInterrupt(tachometerPin), countRpm, RISING); } void loop() { count = 0; delay(1000); int speed = map(count * 60, 0, 3000, 0, 255); // Преобразование в PWM analogWrite(motorPin, speed); } void countRpm() { count++; }

Задание 5: Измерение оборотов с использованием нескольких датчиков

cpp
#define tachometerPin1 2 #define tachometerPin2 3 volatile int count1 = 0; volatile int count2 = 0; void setup() { Serial.begin(9600); attachInterrupt(digitalPinToInterrupt(tachometerPin1), countRpm1, RISING); attachInterrupt(digitalPinToInterrupt(tachometerPin2), countRpm2, RISING); } void loop() { count1 = 0; count2 = 0; delay(1000); Serial.print("RPM1: "); Serial.println(count1 * 60); Serial.print("RPM2: "); Serial.println(count2 * 60); } void countRpm1() { count1++; } void countRpm2() { count2++; }

Сложные задания

Задание 1: Система управления для автоматического регулирования скорости мотора

Создание системы, которая будет регулировать скорость вращения мотора в зависимости от заданных значений.

Задание 2: Анализ данных о скорости вращения

Разработка приложения для визуализации данных о скорости вращения с графическим интерфейсом.

9.

РАЗРАБОТКА ПРИЛОЖЕНИЙ ДЛЯ МОНИТОРИНГА И УПРАВЛЕНИЯ СЕНСОРАМИ

Базовые задания

Задание 1: Веб-приложение для мониторинга данных с сенсоров

Создание простого веб-приложения для отображения данных с различных сенсоров в реальном времени с использованием Node.js и Express.

Задание 2: Мобильное приложение для управления сенсорами

Разработка мобильного приложения, которое позволяет пользователю управлять сенсорами и получать данные с них.

Сложные задания

Задание 1: Умная система мониторинга и управления с использованием IoT

Создание системы, которая объединяет различные сенсоры и позволяет пользователю управлять ими через интернет.

Задание 2: Приложение для анализа данных с графиками и визуализацией

Разработка приложения, которое будет собирать данные с сенсоров и визуализировать их с помощью графиков и диаграмм.

10.

СЕНСОРЫ ПУЛЬСА И КИСЛОРОДА (MAX30100, MAX30102)

Базовые задания

Задание 1: Измерение пульса с использованием MAX30100

cpp
#include <Wire.h> #include "MAX30100_PulseOximeter.h" MAX30100_PulseOximeter pox; void setup() { Serial.begin(9600); pox.begin(); } void loop() { pox.update(); Serial.print("Пульс: "); Serial.print(pox.getHeartRate()); Serial.println(" BPM"); delay(1000); }

Задание 2: Измерение уровня кислорода с использованием MAX30100

cpp
#include <Wire.h> #include "MAX30100_PulseOximeter.h" MAX30100_PulseOximeter pox; void setup() { Serial.begin(9600); pox.begin(); } void loop() { pox.update(); Serial.print("SPO2: "); Serial.print(pox.getSpO2()); Serial.println(" %"); delay(1000); }

Задание 3: Одновременное отображение пульса и кислорода

cpp
#include <Wire.h> #include "MAX30100_PulseOximeter.h" MAX30100_PulseOximeter pox; void setup() { Serial.begin(9600); pox.begin(); } void loop() { pox.update(); Serial.print("Пульс: "); Serial.print(pox.getHeartRate()); Serial.print(" BPM, SPO2: "); Serial.print(pox.getSpO2()); Serial.println(" %"); delay(1000); }

Задание 4: Уведомление при низком уровне кислорода

cpp
#include <Wire.h> #include "MAX30100_PulseOximeter.h" MAX30100_PulseOximeter pox; #define buzzerPin 9 void setup() { Serial.begin(9600); pox.begin(); pinMode(buzzerPin, OUTPUT); } void loop() { pox.update(); if (pox.getSpO2() < 90) { // Порог кислорода digitalWrite(buzzerPin, HIGH); // Включить сигнал } else { digitalWrite(buzzerPin, LOW); // Выключить сигнал } delay(1000); }

Задание 5: Запись данных в SD-карту

cpp
#include <Wire.h> #include <SPI.h> #include <SD.h> #include "MAX30100_PulseOximeter.h" MAX30100_PulseOximeter pox; File dataFile; void setup() { Serial.begin(9600); pox.begin(); if (!SD.begin(4)) { Serial.println("Ошибка инициализации SD-карты!"); return; } } void loop() { pox.update(); dataFile = SD.open("data.txt", FILE_WRITE); if (dataFile) { dataFile.print("Пульс: "); dataFile.print(pox.getHeartRate()); dataFile.print(", SPO2: "); dataFile.println(pox.getSpO2()); dataFile.close(); } delay(1000); }

Сложные задания

Задание 1: Создание портативного монитора здоровья

Создание устройства, которое измеряет пульс и уровень кислорода, с отображением результатов на ЖК-дисплее.

Задание 2: Отправка данных на мобильное приложение

Разработка системы, которая отправляет данные о пульсе и кислороде на мобильное приложение через Bluetooth.

11.

СЕНСОРЫ ОБЪЕМА И МАССЫ (HX711, ПОТЕНЦИОМЕТРЫ)

Базовые задания

Задание 1: Измерение массы с помощью HX711

cpp
#include "HX711.h" HX711 scale; void setup() { Serial.begin(9600); scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN); scale.set_scale(); scale.tare(); } void loop() { Serial.print("Масса: "); Serial.print(scale.get_units(), 1); Serial.println(" g"); delay(1000); }

Задание 2: Калибровка тензодатчика

cpp
#include "HX711.h" HX711 scale; void setup() { Serial.begin(9600); scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN); scale.set_scale(2280.f); // Установите значение для калибровки scale.tare(); } void loop() { Serial.print("Масса: "); Serial.print(scale.get_units(), 1); Serial.println(" g"); delay(1000); }

Задание 3: Управление светодиодом в зависимости от веса

cpp
#include "HX711.h" HX711 scale; #define ledPin 9 void setup() { Serial.begin(9600); scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN); scale.set_scale(); scale.tare(); pinMode(ledPin, OUTPUT); } void loop() { float weight = scale.get_units(); if (weight > 500) { // Порог веса digitalWrite(ledPin, HIGH); // Включить светодиод } else { digitalWrite(ledPin, LOW); // Выключить светодиод } delay(1000); }

Задание 4: Отображение веса на ЖК-дисплее

cpp
#include "HX711.h" #include <LiquidCrystal.h> HX711 scale; LiquidCrystal lcd(12, 11, 5, 4, 3, 2); void setup() { Serial.begin(9600); scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN); scale.set_scale(); scale.tare(); lcd.begin(16, 2); } void loop() { lcd.clear(); lcd.print("Вес: "); lcd.print(scale.get_units(), 1); lcd.print(" g"); delay(1000); }

Задание 5: Запись данных веса на SD-карту

cpp
#include "HX711.h" #include <SD.h> HX711 scale; File dataFile; void setup() { Serial.begin(9600); scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN); scale.set_scale(); scale.tare(); if (!SD.begin(4)) { Serial.println("Ошибка инициализации SD-карты!"); } } void loop() { float weight = scale.get_units(); dataFile = SD.open("weight.txt", FILE_WRITE); if (dataFile) { dataFile.println(weight); dataFile.close(); } delay(1000); }

Сложные задания

Задание 1: Создание весов с ЖК-дисплеем

Создание весов, отображающих массу на ЖК-дисплее и сигнализирующих о превышении порога.

Задание 2: Умные весы с Bluetooth

Разработка системы, отправляющей данные о массе на мобильное приложение через Bluetooth.

12.

СЕНСОРЫ ДЛЯ МОНИТОРИНГА ОКРУЖАЮЩЕЙ СРЕДЫ (SDS011, MH-Z19)

Базовые задания

Задание 1: Измерение качества воздуха с использованием SDS011

cpp
#include <SoftwareSerial.h> #include "SDS011.h" SoftwareSerial mySerial(10, 11); // RX, TX SDS011 sds(mySerial); void setup() { Serial.begin(9600); mySerial.begin(9600); sds.begin(); } void loop() { float pm25, pm10; sds.read(&pm25, &pm10); Serial.print("PM2.5: "); Serial.print(pm25); Serial.print(" µg/m³, PM10: "); Serial.print(pm10); Serial.println(" µg/m³"); delay(1000); }

Задание 2: Измерение уровня CO2 с использованием MH-Z19

cpp
#include <SoftwareSerial.h> #include "MHZ19.h" SoftwareSerial mySerial(10, 11); // RX, TX MHZ19 myMHZ19(mySerial); void setup() { Serial.begin(9600); mySerial.begin(9600); myMHZ19.begin(); } void loop() { int co2 = myMHZ19.getCO2(); Serial.print("CO2: "); Serial.print(co2); Serial.println(" ppm"); delay(1000); }

Задание 3: Одновременное измерение PM2.5 и CO2

cpp
#include <SoftwareSerial.h> #include "SDS011.h" #include "MHZ19.h" SoftwareSerial mySerial1(10, 11); // RX, TX для SDS011 SoftwareSerial mySerial2(12, 13); // RX, TX для MH-Z19 SDS011 sds(mySerial1); MHZ19 myMHZ19(mySerial2); void setup() { Serial.begin(9600); mySerial1.begin(9600); mySerial2.begin(9600); sds.begin(); myMHZ19.begin(); } void loop() { float pm25, pm10; sds.read(&pm25, &pm10); int co2 = myMHZ19.getCO2(); Serial.print("PM2.5: "); Serial.print(pm25); Serial.print(" µg/m³, PM10: "); Serial.print(pm10); Serial.print(" µg/m³, CO2: "); Serial.print(co2); Serial.println(" ppm"); delay(1000); }

Задание 4: Визуализация данных на LCD

cpp
#include <LiquidCrystal.h> #include <SoftwareSerial.h> #include "SDS011.h" #include "MHZ19.h" SoftwareSerial mySerial1(10, 11); // RX, TX для SDS011 SoftwareSerial mySerial2(12, 13); // RX, TX для MH-Z19 SDS011 sds(mySerial1); MHZ19 myMHZ19(mySerial2); LiquidCrystal lcd(7, 8, 9, 10, 11, 12); void setup() { Serial.begin(9600); mySerial1.begin(9600); mySerial2.begin(9600); sds.begin(); myMHZ19.begin(); lcd.begin(16, 2); } void loop() { float pm25, pm10; sds.read(&pm25, &pm10); int co2 = myMHZ19.getCO2(); lcd.clear(); lcd.print("PM2.5: "); lcd.print(pm25); lcd.setCursor(0, 1); lcd.print("CO2: "); lcd.print(co2); delay(1000); }

Задание 5: Уведомление о превышении порога загрязнения

cpp
#include <SoftwareSerial.h> #include "SDS011.h" #include "MHZ19.h" SoftwareSerial mySerial1(10, 11); // RX, TX для SDS011 SoftwareSerial mySerial2(12, 13); // RX, TX для MH-Z19 SDS011 sds(mySerial1); MHZ19 myMHZ19(mySerial2); #define buzzerPin 9 void setup() { Serial.begin(9600); mySerial1.begin(9600); mySerial2.begin(9600); sds.begin(); myMHZ19.begin(); pinMode(buzzerPin, OUTPUT); } void loop() { float pm25, pm10; sds.read(&pm25, &pm10); int co2 = myMHZ19.getCO2(); if (pm25 > 35 || co2 > 1000) { // Порог digitalWrite(buzzerPin, HIGH); // Включить сигнал } else { digitalWrite(buzzerPin, LOW); // Выключить сигнал } delay(1000); }

Сложные задания

Задание 1: Умная система контроля качества воздуха

Создание системы, которая отображает данные о качестве воздуха и отправляет уведомления в случае превышения порога.

Задание 2: Создание веб-приложения для мониторинга качества воздуха

Разработка веб-приложения, которое отображает данные о качестве воздуха с различных датчиков в реальном времени.

13.

СЕНСОРЫ ДАВЛЕНИЯ ВОДЫ (MPX5010, MS5803)

Базовые задания

Задание 1: Измерение давления с MPX5010

cpp
#include <Arduino.h> #define PressureSensorPin A0 void setup() { Serial.begin(9600); } void loop() { int sensorValue = analogRead(PressureSensorPin); float pressure = (sensorValue / 1023.0) * 5.0; // Конвертация в вольты Serial.print("Давление: "); Serial.print(pressure); Serial.println(" V"); delay(1000); }

Задание 2: Калибровка и вывод давления в миллибарах

cpp
#include <Arduino.h> #define PressureSensorPin A0 void setup() { Serial.begin(9600); } void loop() { int sensorValue = analogRead(PressureSensorPin); float pressure = ((sensorValue / 1023.0) * 5.0) * 100; // Конвертация в миллибары Serial.print("Давление: "); Serial.print(pressure); Serial.println(" mbar"); delay(1000); }

Задание 3: Отображение давления на ЖК-дисплее

cpp
#include <LiquidCrystal.h> #define PressureSensorPin A0 LiquidCrystal lcd(7, 8, 9, 10, 11, 12); void setup() { Serial.begin(9600); lcd.begin(16, 2); } void loop() { int sensorValue = analogRead(PressureSensorPin); float pressure = ((sensorValue / 1023.0) * 5.0) * 100; lcd.clear(); lcd.print("Давление: "); lcd.print(pressure); lcd.print(" mbar"); delay(1000); }

Задание 4: Уведомление о высоком давлении

cpp
#include <Arduino.h> #define PressureSensorPin A0 #define buzzerPin 9 void setup() { Serial.begin(9600); pinMode(buzzerPin, OUTPUT); } void loop() { int sensorValue = analogRead(PressureSensorPin); float pressure = ((sensorValue / 1023.0) * 5.0) * 100; if (pressure > 1500) { // Порог давления digitalWrite(buzzerPin, HIGH); // Включить сигнал } else { digitalWrite(buzzerPin, LOW); // Выключить сигнал } delay(1000); }

Задание 5: Запись данных о давлении на SD-карту

cpp
#include <SD.h> #include <SPI.h> #define PressureSensorPin A0 File dataFile; void setup() { Serial.begin(9600); if (!SD.begin(4)) { Serial.println("Ошибка инициализации SD-карты!"); } } void loop() { int sensorValue = analogRead(PressureSensorPin); float pressure = ((sensorValue / 1023.0) * 5.0) * 100; dataFile = SD.open("pressure.txt", FILE_WRITE); if (dataFile) { dataFile.println(pressure); dataFile.close(); } delay(1000); }

Сложные задания

Задание 1: Создание системы мониторинга давления воды

Создание системы, которая отображает давление на ЖК-дисплее и записывает данные на SD-карту.

Задание 2: Умный насос с контролем давления

Разработка системы, контролирующей насос и включающей его при достижении определенного давления.

14.

СЕНСОРЫ ДЛЯ КОНТРОЛЯ ЭЛЕКТРОСЕТИ (ACS712, ZMPT101B)

Базовые задания

Задание 1: Измерение тока с использованием ACS712

cpp
#include <ACS712.h> ACS712 sensor(ACS712_30A, A0); // Определите модель датчика void setup() { Serial.begin(9600); } void loop() { float current = sensor.getCurrentAC(); // Измерение переменного тока Serial.print("Ток: "); Serial.print(current); Serial.println(" A"); delay(1000); }

Задание 2: Измерение напряжения с ZMPT101B

cpp
#define VoltageSensorPin A0 void setup() { Serial.begin(9600); } void loop() { int sensorValue = analogRead(VoltageSensorPin); float voltage = (sensorValue / 1023.0) * 5.0; // Конвертация в вольты Serial.print("Напряжение: "); Serial.print(voltage); Serial.println(" V"); delay(1000); }

Задание 3: Вычисление мощности в цепи

cpp
#include <ACS712.h> ACS712 currentSensor(ACS712_30A, A0); #define VoltageSensorPin A1 void setup() { Serial.begin(9600); } void loop() { float current = currentSensor.getCurrentAC(); int sensorValue = analogRead(VoltageSensorPin); float voltage = (sensorValue / 1023.0) * 5.0; float power = voltage * current; Serial.print("Мощность: "); Serial.print(power); Serial.println(" W"); delay(1000); }

Задание 4: Уведомление о превышении мощности

cpp
#include <ACS712.h> ACS712 currentSensor(ACS712_30A, A0); #define VoltageSensorPin A1 #define buzzerPin 9 void setup() { Serial.begin(9600); pinMode(buzzerPin, OUTPUT); } void loop() { float current = currentSensor.getCurrentAC(); int sensorValue = analogRead(VoltageSensorPin); float voltage = (sensorValue / 1023.0) * 5.0; float power = voltage * current; if (power > 1000) { // Порог мощности digitalWrite(buzzerPin, HIGH); // Включить сигнал } else { digitalWrite(buzzerPin, LOW); // Выключить сигнал } delay(1000); }

Задание 5: Запись данных о токе и напряжении на SD-карту

cpp
#include <SD.h> #include <SPI.h> #include <ACS712.h> ACS712 currentSensor(ACS712_30A, A0); #define VoltageSensorPin A1 File dataFile; void setup() { Serial.begin(9600); if (!SD.begin(4)) { Serial.println("Ошибка инициализации SD-карты!"); } } void loop() { float current = currentSensor.getCurrentAC(); int sensorValue = analogRead(VoltageSensorPin); float voltage = (sensorValue / 1023.0) * 5.0; dataFile = SD.open("power.txt", FILE_WRITE); if (dataFile) { dataFile.print("Ток: "); dataFile.print(current); dataFile.print(" A, Напряжение: "); dataFile.print(voltage); dataFile.println(" V"); dataFile.close(); } delay(1000); }

Сложные задания

Задание 1: Создание системы мониторинга электросети

Создание системы, которая отображает ток, напряжение и мощность на ЖК-дисплее и записывает данные на SD-карту.

Задание 2: Умное управление электросетью

Разработка системы, которая управляет электроприборами в зависимости от потребляемой мощности.

15.

СЕНСОРЫ ДЛЯ РАСПОЗНАВАНИЯ ОБЪЕКТОВ (HC-SR04, VL53L0X)

Базовые задания

Задание 1: Измерение расстояния с HC-SR04

cpp
#define triggerPin 9 #define echoPin 10 void setup() { Serial.begin(9600); pinMode(triggerPin, OUTPUT); pinMode(echoPin, INPUT); } void loop() { digitalWrite(triggerPin, LOW); delayMicroseconds(2); digitalWrite(triggerPin, HIGH); delayMicroseconds(10); digitalWrite(triggerPin, LOW); long duration = pulseIn(echoPin, HIGH); float distance = duration * 0.034 / 2; // Расчет расстояния в см Serial.print("Расстояние: "); Serial.print(distance); Serial.println(" см"); delay(1000); }

Задание 2: Измерение расстояния с VL53L0X

cpp
#include <Wire.h> #include <VL53L0X.h> VL53L0X sensor; void setup() { Serial.begin(9600); Wire.begin(); sensor.init(); sensor.setTimeout(500); } void loop() { float distance = sensor.readRangeSingleMillimeters(); Serial.print("Расстояние: "); Serial.print(distance); Serial.println(" мм"); delay(1000); }

Задание 3: Использование обоих сенсоров для измерения расстояния

cpp
#define triggerPin 9 #define echoPin 10 #include <Wire.h> #include <VL53L0X.h> VL53L0X sensor; void setup() { Serial.begin(9600); pinMode(triggerPin, OUTPUT); pinMode(echoPin, INPUT); Wire.begin(); sensor.init(); sensor.setTimeout(500); } void loop() { // HC-SR04 digitalWrite(triggerPin, LOW); delayMicroseconds(2); digitalWrite(triggerPin, HIGH); delayMicroseconds(10); digitalWrite(triggerPin, LOW); long duration = pulseIn(echoPin, HIGH); float distanceHC = duration * 0.034 / 2; // Расчет расстояния в см // VL53L0X float distanceVL = sensor.readRangeSingleMillimeters(); Serial.print("HC-SR04: "); Serial.print(distanceHC); Serial.print(" см, VL53L0X: "); Serial.print(distanceVL); Serial.println(" мм"); delay(1000); }

Задание 4: Уведомление о препятствии

cpp
#define triggerPin 9 #define echoPin 10 #define buzzerPin 8 void setup() { Serial.begin(9600); pinMode(triggerPin, OUTPUT); pinMode(echoPin, INPUT); pinMode(buzzerPin, OUTPUT); } void loop() { digitalWrite(triggerPin, LOW); delayMicroseconds(2); digitalWrite(triggerPin, HIGH); delayMicroseconds(10); digitalWrite(triggerPin, LOW); long duration = pulseIn(echoPin, HIGH); float distance = duration * 0.034 / 2; if (distance < 10) { // Порог в 10 см digitalWrite(buzzerPin, HIGH); // Включить сигнал } else { digitalWrite(buzzerPin, LOW); // Выключить сигнал } delay(1000); }

Задание 5: Визуализация расстояния на ЖК-дисплее

cpp
#include <LiquidCrystal.h> #define triggerPin 9 #define echoPin 10 LiquidCrystal lcd(7, 8, 9, 10, 11, 12); void setup() { Serial.begin(9600); lcd.begin(16, 2); pinMode(triggerPin, OUTPUT); pinMode(echoPin, INPUT); } void loop() { digitalWrite(triggerPin, LOW); delayMicroseconds(2); digitalWrite(triggerPin, HIGH); delayMicroseconds(10); digitalWrite(triggerPin, LOW); long duration = pulseIn(echoPin, HIGH); float distance = duration * 0.034 / 2; lcd.clear(); lcd.print("Расстояние: "); lcd.print(distance); lcd.print(" см"); delay(1000); }

Сложные задания

Задание 1: Создание системы распознавания объектов

Создание устройства, которое определяет наличие объектов на расстоянии и сигнализирует об этом.

Задание 2: Автономный робот с избеганием препятствий

Разработка автономного робота, который использует сенсоры для избегания препятствий.

16.

СЕНСОРЫ ВРАЩЕНИЯ (TACHOMETER)

Базовые задания

Задание 1: Измерение угловой скорости с использованием тахометра

cpp
#define tachometerPin 2 volatile int rpmCount = 0; void setup() { Serial.begin(9600); attachInterrupt(digitalPinToInterrupt(tachometerPin), countRPM, RISING); } void loop() { rpmCount = 0; sei(); // Разрешить прерывания delay(1000); // Счет за 1 секунду cli(); // Запретить прерывания float rpm = (rpmCount * 60); // Перевод в RPM Serial.print("Угловая скорость: "); Serial.print(rpm); Serial.println(" RPM"); } void countRPM() { rpmCount++; }

Задание 2: Вычисление угловой скорости в градусах

cpp
#define tachometerPin 2 volatile int tachometerCount = 0; void setup() { Serial.begin(9600); attachInterrupt(digitalPinToInterrupt(tachometerPin), countTachometer, RISING); } void loop() { tachometerCount = 0; sei(); delay(1000); cli(); float degrees = (tachometerCount * 360); // Перевод в градусы Serial.print("Угловая скорость: "); Serial.print(degrees); Serial.println(" градусы"); } void countTachometer() { tachometerCount++; }

Задание 3: Отображение угловой скорости на ЖК-дисплее

cpp
#include <LiquidCrystal.h> #define tachometerPin 2 volatile int rpmCount = 0; LiquidCrystal lcd(7, 8, 9, 10, 11, 12); void setup() { Serial.begin(9600); lcd.begin(16, 2); attachInterrupt(digitalPinToInterrupt(tachometerPin), countRPM, RISING); } void loop() { rpmCount = 0; sei(); delay(1000); cli(); float rpm = (rpmCount * 60); lcd.clear(); lcd.print("RPM: "); lcd.print(rpm); delay(1000); } void countRPM() { rpmCount++; }

Задание 4: Уведомление о высокой угловой скорости

cpp
#include <LiquidCrystal.h> #define tachometerPin 2 #define buzzerPin 9 volatile int rpmCount = 0; LiquidCrystal lcd(7, 8, 9, 10, 11, 12); void setup() { Serial.begin(9600); lcd.begin(16, 2); pinMode(buzzerPin, OUTPUT); attachInterrupt(digitalPinToInterrupt(tachometerPin), countRPM, RISING); } void loop() { rpmCount = 0; sei(); delay(1000); cli(); float rpm = (rpmCount * 60); lcd.clear(); lcd.print("RPM: "); lcd.print(rpm); if (rpm > 3000) { // Порог угловой скорости digitalWrite(buzzerPin, HIGH); // Включить сигнал } else { digitalWrite(buzzerPin, LOW); // Выключить сигнал } delay(1000); } void countRPM() { rpmCount++; }

Задание 5: Запись данных о угловой скорости на SD-карту

cpp
#include <SD.h> #include <SPI.h> #define tachometerPin 2 File dataFile; volatile int rpmCount = 0; void setup() { Serial.begin(9600); if (!SD.begin(4)) { Serial.println("Ошибка инициализации SD-карты!"); } attachInterrupt(digitalPinToInterrupt(tachometerPin), countRPM, RISING); } void loop() { rpmCount = 0; sei(); delay(1000); cli(); float rpm = (rpmCount * 60); dataFile = SD.open("rpm.txt", FILE_WRITE); if (dataFile) { dataFile.print("RPM: "); dataFile.println(rpm); dataFile.close(); } delay(1000); } void countRPM() { rpmCount++; }

Сложные задания

Задание 1: Создание системы контроля угловой скорости

Создание системы, которая отображает угловую скорость на ЖК-дисплее и записывает данные на SD-карту.

Задание 2: Умное управление моторами по угловой скорости

Разработка системы, которая управляет моторами в зависимости от их угловой скорости.

17.

СЕНСОРЫ ОКРУЖАЮЩЕЙ СРЕДЫ (DHT11, BMP180)

Базовые задания

Задание 1: Измерение температуры и влажности с DHT11

cpp
#include <DHT.h> #define DHTPIN 2 #define DHTTYPE DHT11 DHT dht(DHTPIN, DHTTYPE); void setup() { Serial.begin(9600); dht.begin(); } void loop() { float humidity = dht.readHumidity(); float temperature = dht.readTemperature(); Serial.print("Температура: "); Serial.print(temperature); Serial.print(" °C, Влажность: "); Serial.print(humidity); Serial.println(" %"); delay(2000); }

Задание 2: Измерение давления и высоты с BMP180

cpp
#include <Wire.h> #include <Adafruit_Sensor.h> #include <Adafruit_BMP085_U.h> Adafruit_BMP085_Unified bmp = Adafruit_BMP085_Unified(); void setup() { Serial.begin(9600); if (!bmp.begin()) { Serial.println("Ошибка инициализации BMP180!"); while (1); } } void loop() { sensors_event_t event; bmp.getEvent(&event); if (event.pressure) { Serial.print("Давление: "); Serial.print(event.pressure); Serial.println(" hPa"); } delay(2000); }

Задание 3: Вывод температуры и влажности на ЖК-дисплее

cpp
#include <DHT.h> #include <LiquidCrystal.h> #define DHTPIN 2 #define DHTTYPE DHT11 DHT dht(DHTPIN, DHTTYPE); LiquidCrystal lcd(7, 8, 9, 10, 11, 12); void setup() { Serial.begin(9600); dht.begin(); lcd.begin(16, 2); } void loop() { float humidity = dht.readHumidity(); float temperature = dht.readTemperature(); lcd.clear(); lcd.print("Temp: "); lcd.print(temperature); lcd.print(" C"); lcd.setCursor(0, 1); lcd.print("Humidity: "); lcd.print(humidity); lcd.print(" %"); delay(2000); }

Задание 4: Уведомление о высокой температуре

cpp
#include <DHT.h> #define DHTPIN 2 #define DHTTYPE DHT11 #define buzzerPin 9 DHT dht(DHTPIN, DHTTYPE); void setup() { Serial.begin(9600); dht.begin(); pinMode(buzzerPin, OUTPUT); } void loop() { float temperature = dht.readTemperature(); if (temperature > 30) { // Порог температуры digitalWrite(buzzerPin, HIGH); // Включить сигнал } else { digitalWrite(buzzerPin, LOW); // Выключить сигнал } delay(2000); }

Задание 5: Запись данных о температуре и влажности на SD-карту

cpp
#include <DHT.h> #include <SD.h> #include <SPI.h> #define DHTPIN 2 #define DHTTYPE DHT11 File dataFile; DHT dht(DHTPIN, DHTTYPE); void setup() { Serial.begin(9600); dht.begin(); if (!SD.begin(4)) { Serial.println("Ошибка инициализации SD-карты!"); } } void loop() { float humidity = dht.readHumidity(); float temperature = dht.readTemperature(); dataFile = SD.open("env_data.txt", FILE_WRITE); if (dataFile) { dataFile.print("Temperature: "); dataFile.print(temperature); dataFile.print(" C, Humidity: "); dataFile.print(humidity); dataFile.println(" %"); dataFile.close(); } delay(2000); }

Сложные задания

Задание 1: Создание системы мониторинга окружающей среды

Создание системы, которая отображает температуру, влажность и давление на ЖК-дисплее и записывает данные на SD-карту.

Задание 2: Умное управление климатом

Разработка системы, которая управляет обогревателем или вентилятором в зависимости от температуры и влажности.

18.

СЕНСОРЫ ДЛЯ УМНОГО ДОМА (MQ, PIR)

Базовые задания

Задание 1: Измерение качества воздуха с MQ-2

cpp
#define MQ2Pin A0 void setup() { Serial.begin(9600); } void loop() { int sensorValue = analogRead(MQ2Pin); Serial.print("Качество воздуха: "); Serial.println(sensorValue); delay(1000); }

Задание 2: Обнаружение движения с PIR

cpp
#define PIRPin 2 void setup() { Serial.begin(9600); pinMode(PIRPin, INPUT); } void loop() { int motionDetected = digitalRead(PIRPin); if (motionDetected) { Serial.println("Движение обнаружено!"); } else { Serial.println("Нет движения."); } delay(1000); }

Задание 3: Уведомление о высоком уровне газа с MQ-2

cpp
#define MQ2Pin A0 #define buzzerPin 9 void setup() { Serial.begin(9600); pinMode(buzzerPin, OUTPUT); } void loop() { int sensorValue = analogRead(MQ2Pin); if (sensorValue > 400) { // Порог газа digitalWrite(buzzerPin, HIGH); // Включить сигнал } else { digitalWrite(buzzerPin, LOW); // Выключить сигнал } delay(1000); }

Задание 4: Включение света при обнаружении движения

cpp
#define PIRPin 2 #define lightPin 8 void setup() { Serial.begin(9600); pinMode(PIRPin, INPUT); pinMode(lightPin, OUTPUT); } void loop() { int motionDetected = digitalRead(PIRPin); if (motionDetected) { digitalWrite(lightPin, HIGH); // Включить свет } else { digitalWrite(lightPin, LOW); // Выключить свет } delay(1000); }

ChatGPT

19.

СЕНСОРЫ ПУЛЬСА И КИСЛОРОДА (MAX30100, MAX30102)

Базовые задания

Задание 1: Измерение частоты пульса с помощью MAX30100

cpp
#include <Wire.h> #include "MAX30100_PulseOximeter.h" #define REPORTING_PERIOD_MS 1000 PulseOximeter pox; uint32_t tsLastReport = 0; void setup() { Serial.begin(9600); if (!pox.begin()) { Serial.println("Ошибка инициализации MAX30100"); while (1); } pox.setOnBeatDetectedCallback(onBeatDetected); } void loop() { pox.update(); if (millis() - tsLastReport > REPORTING_PERIOD_MS) { Serial.print("ЧСС: "); Serial.println(pox.getHeartRate()); tsLastReport = millis(); } } void onBeatDetected() { Serial.println("Пульс обнаружен"); }

Задание 2: Отображение пульса и уровня кислорода на дисплее

cpp
#include <Wire.h> #include <LiquidCrystal_I2C.h> #include "MAX30100_PulseOximeter.h" LiquidCrystal_I2C lcd(0x27, 16, 2); PulseOximeter pox; uint32_t tsLastReport = 0; void setup() { Serial.begin(9600); lcd.begin(); if (!pox.begin()) { Serial.println("Ошибка инициализации MAX30100"); while (1); } pox.setOnBeatDetectedCallback(onBeatDetected); } void loop() { pox.update(); if (millis() - tsLastReport > 1000) { lcd.clear(); lcd.setCursor(0, 0); lcd.print("ЧСС: "); lcd.print(pox.getHeartRate()); lcd.setCursor(0, 1); lcd.print("SpO2: "); lcd.print(pox.getSpO2()); tsLastReport = millis(); } } void onBeatDetected() { Serial.println("Пульс обнаружен"); }

Задание 3: Запись пульса на SD-карту

cpp
#include <Wire.h> #include <SD.h> #include "MAX30100_PulseOximeter.h" #define CS_PIN 4 PulseOximeter pox; File dataFile; void setup() { Serial.begin(9600); if (!SD.begin(CS_PIN)) { Serial.println("Ошибка SD-карты"); while (1); } if (!pox.begin()) { Serial.println("Ошибка инициализации MAX30100"); while (1); } } void loop() { pox.update(); if (millis() % 1000 == 0) { dataFile = SD.open("pulse_data.txt", FILE_WRITE); if (dataFile) { dataFile.print("ЧСС: "); dataFile.println(pox.getHeartRate()); dataFile.close(); } } }

Задание 4: Уведомление о низком уровне кислорода

cpp
#include <Wire.h> #include "MAX30100_PulseOximeter.h" #define REPORTING_PERIOD_MS 1000 PulseOximeter pox; void setup() { Serial.begin(9600); if (!pox.begin()) { Serial.println("Ошибка инициализации MAX30100"); while (1); } pox.setOnBeatDetectedCallback(onBeatDetected); } void loop() { pox.update(); if (pox.getSpO2() < 90) { Serial.println("Внимание! Низкий уровень кислорода!"); } } void onBeatDetected() { Serial.println("Пульс обнаружен"); }

Задание 5: Подключение к Bluetooth для передачи данных

Используйте модуль HC-05 для передачи данных пульса и уровня кислорода на смартфон по Bluetooth.

Сложные задания

Задание 1: Мобильный мониторинг здоровья

Создание системы, передающей данные по Bluetooth для постоянного мониторинга.

Задание 2: Уведомление при низком уровне кислорода и повышенном пульсе

Настройка уведомлений при низких уровнях кислорода или высоких показателях пульса.

20.

СЕНСОРЫ УРОВНЯ И МАССЫ (HX711, ПОТЕНЦИОМЕТРЫ)

Базовые задания

Задание 1: Измерение веса с HX711

cpp
#include "HX711.h" #define DOUT_PIN 3 #define SCK_PIN 2 HX711 scale; void setup() { Serial.begin(9600); scale.begin(DOUT_PIN, SCK_PIN); scale.set_scale(2280.f); // Калибровка scale.tare(); } void loop() { Serial.print("Вес: "); Serial.println(scale.get_units(), 1); delay(1000); }

Задание 2: Регулировка значения с потенциометром

cpp
#define POT_PIN A0 void setup() { Serial.begin(9600); } void loop() { int potValue = analogRead(POT_PIN); Serial.print("Значение: "); Serial.println(potValue); delay(500); }

Задание 3: Включение светодиода в зависимости от массы

cpp
#include "HX711.h" #define DOUT_PIN 3 #define SCK_PIN 2 #define LED_PIN 9 HX711 scale; void setup() { Serial.begin(9600); scale.begin(DOUT_PIN, SCK_PIN); pinMode(LED_PIN, OUTPUT); } void loop() { float weight = scale.get_units(); if (weight > 500) { // Порог массы digitalWrite(LED_PIN, HIGH); } else { digitalWrite(LED_PIN, LOW); } delay(1000); }

Задание 4: Отображение массы на дисплее

Задание 5: Подсчет суммарной массы при добавлении объектов

Сложные задания

Задание 1: Контроль наполнения контейнера

Система, контролирующая наполненность контейнера, с уведомлением при достижении веса.

Задание 2: Мониторинг массы на основе времени

Запись изменения веса на SD-карту для отслеживания.

21.

СЕНСОРЫ ДЛЯ МОНИТОРИНГА ОКРУЖАЮЩЕЙ СРЕДЫ (SDS011, MH-Z19)

Базовые задания

Задание 1: Измерение PM2.5 и PM10 частиц

Используйте библиотеку для SDS011 для измерения уровня частиц.

Задание 2: Измерение CO2 с MH-Z19

Считывание уровня CO2 и отображение на ЖК-дисплее.

Задание 3: Уведомление о высоком уровне CO2

Пример включения звукового сигнала при превышении 1000 ppm CO2.

Сложные задания

Задание 1: Мобильное приложение для контроля загрязненности

Отправка данных CO2 и PM по Wi-Fi для мониторинга на смартфоне.

Задание 2: Полный мониторинг качества воздуха

Создание устройства с несколькими сенсорами для мониторинга параметров воздуха.

2/2
продолжай
ChatGPT

22.

СЕНСОРЫ ДАВЛЕНИЯ ВОДЫ (MPX5010, MS5803)

Базовые задания

Задание 1: Измерение давления воды с помощью MPX5010

Использование MPX5010 для мониторинга давления воды и отображения показаний в серийном мониторе.

cpp
#define PRESSURE_PIN A0 #define VOLTAGE_AT_ZERO_PRESSURE 0.5 // Напряжение при нулевом давлении для MPX5010 #define MAX_PRESSURE_VOLTAGE 4.5 void setup() { Serial.begin(9600); } void loop() { float voltage = analogRead(PRESSURE_PIN) * (5.0 / 1023.0); float pressure = (voltage - VOLTAGE_AT_ZERO_PRESSURE) * 100 / (MAX_PRESSURE_VOLTAGE - VOLTAGE_AT_ZERO_PRESSURE); Serial.print("Давление: "); Serial.print(pressure); Serial.println(" кПа"); delay(1000); }

Задание 2: Уведомление при высоком давлении

Пример уведомления при превышении определенного уровня давления воды.

Задание 3: Подача сигнала при изменении давления

Настройка для подачи звукового сигнала, когда давление изменяется на заданную величину.

Задание 4: Отображение давления на ЖК-дисплее

Вывод данных давления воды на LCD дисплей.

Задание 5: Калибровка датчика давления

Простая программа для калибровки датчика с сохранением минимального и максимального давления.

Сложные задания

Задание 1: Система управления давлением в трубопроводе

Создание системы, которая контролирует давление в трубах и включает реле при превышении допустимого уровня.

Задание 2: Отслеживание изменения давления с записью данных

Запись данных давления на SD-карту для отслеживания изменения уровня давления.

Задание 3: Мобильный мониторинг давления

Отправка данных о давлении через Wi-Fi для дистанционного мониторинга через приложение.

23. Сенсор уровня воды

Базовые задания

Задание 1: Определение уровня воды с помощью простого датчика уровня

Подключение датчика уровня воды и вывод показаний в серийный монитор.

cpp
#define WATER_SENSOR_PIN A0 void setup() { Serial.begin(9600); } void loop() { int waterLevel = analogRead(WATER_SENSOR_PIN); Serial.print("Уровень воды: "); Serial.println(waterLevel); delay(1000); }

Задание 2: Уведомление при низком уровне воды

Настройка для уведомления, когда уровень воды падает ниже заданного уровня.

Задание 3: Управление насосом на основе уровня воды

Включение и выключение насоса в зависимости от уровня воды.

Задание 4: Вывод уровня воды на ЖК-дисплее

Отображение уровня воды на LCD дисплее для удобного мониторинга.

Задание 5: Калибровка датчика уровня воды

Программа для калибровки минимального и максимального значений уровня воды.

Сложные задания

Задание 1: Система контроля уровня воды с записью данных

Создание системы, которая записывает уровень воды на SD-карту для дальнейшего анализа.

Задание 2: Дистанционный мониторинг уровня воды

Передача данных о уровне воды по Wi-Fi для мониторинга в приложении.

Задание 3: Автоматическая система полива на основе уровня воды

Система автоматического полива, которая запускается при достижении низкого уровня воды.

24. Сенсоры касания и тактильные переключатели

Базовые задания

Задание 1: Определение прикосновения

Использование сенсора касания для определения нажатия и вывода результата в серийный монитор.

cpp
#define TOUCH_SENSOR_PIN 2 void setup() { Serial.begin(9600); pinMode(TOUCH_SENSOR_PIN, INPUT); } void loop() { if (digitalRead(TOUCH_SENSOR_PIN)) { Serial.println("Касание обнаружено"); } delay(500); }

Задание 2: Управление светодиодом при касании

Включение и выключение светодиода в зависимости от состояния сенсора касания.

Задание 3: Уведомление о двойном касании

Программа для обнаружения двойного касания.

Задание 4: Использование сенсора касания в качестве кнопки

Настройка сенсора касания для выполнения действия при нажатии.

Задание 5: Калибровка сенсора касания

Программа для настройки чувствительности сенсора касания.

Сложные задания

Задание 1: Создание сенсорного управления с использованием нескольких датчиков

Реализация системы управления, использующей несколько сенсоров для разных действий.

Задание 2: Мониторинг нажатий на сенсор касания с записью данных

Запись количества нажатий на сенсор касания для анализа поведения пользователя.

Задание 3: Сенсорное управление RGB-освещением

Настройка RGB-светодиода для изменения цвета при каждом касании.

продолжи на другие сенсоры , не забывай примеры кода
ChatGPT

25.

АНЕМОМЕТР (ДАТЧИК СКОРОСТИ ВЕТРА)

Базовые задания

Задание 1: Измерение скорости ветра с помощью анемометра

Подключите анемометр, измеряющий скорость ветра в метрах в секунду, и выводите значения в серийный монитор.

cpp
#define WIND_SENSOR_PIN 2 volatile int windCount = 0; float windSpeed = 0; void setup() { Serial.begin(9600); attachInterrupt(digitalPinToInterrupt(WIND_SENSOR_PIN), countWind, RISING); } void loop() { windSpeed = (windCount / 2.0) * 2.4; // Примерная калибровка для преобразования Serial.print("Скорость ветра: "); Serial.print(windSpeed); Serial.println(" м/с"); windCount = 0; delay(1000); } void countWind() { windCount++; }

Задание 2: Вывод скорости ветра на ЖК-дисплей

Отображение значений скорости ветра на LCD дисплее.

Задание 3: Уведомление о сильном ветре

Программа для подачи звукового сигнала при превышении установленного порога скорости ветра.

Задание 4: Сохранение данных скорости ветра на SD-карту

Запись данных скорости ветра на SD-карту для дальнейшего анализа.

Задание 5: Калибровка анемометра

Программа для настройки и калибровки датчика скорости ветра.

Сложные задания

Задание 1: Автоматическая система защиты при сильном ветре

Система, которая подает сигнал или включает реле для защиты конструкции при сильном ветре.

Задание 2: Дистанционный мониторинг скорости ветра через Wi-Fi

Передача данных о скорости ветра на сервер для мониторинга в реальном времени через мобильное приложение.

26. Датчик для измерения осадков (рейн гейдж)

Базовые задания

Задание 1: Измерение количества осадков

Подключите датчик дождя и считайте количество осадков, выводя значения в серийный монитор.

cpp
#define RAIN_SENSOR_PIN A0 void setup() { Serial.begin(9600); } void loop() { int rainValue = analogRead(RAIN_SENSOR_PIN); float rainfall = rainValue * 0.1; // Коэффициент для преобразования в мм Serial.print("Количество осадков: "); Serial.print(rainfall); Serial.println(" мм"); delay(1000); }

Задание 2: Сигнализация при высоком уровне осадков

Программа для подачи звукового сигнала при достижении определенного уровня осадков.

Задание 3: Сохранение данных осадков на SD-карту

Запись данных уровня осадков на SD-карту для мониторинга в течение длительного периода.

Задание 4: Отображение данных осадков на ЖК-дисплее

Вывод уровня осадков на LCD дисплей для удобного мониторинга.

Задание 5: Калибровка датчика осадков

Программа для настройки и калибровки датчика осадков.

Сложные задания

Задание 1: Система управления поливом на основе осадков

Создание системы полива, которая автоматически отключается, если уровень осадков превышает установленный предел.

Задание 2: Дистанционный мониторинг осадков через Wi-Fi

Передача данных о количестве осадков на сервер для мониторинга с использованием мобильного приложения.

27.

АКСЕЛЕРОМЕТР И ГИРОСКОП (НАПРИМЕР, MPU6050)

Базовые задания

Задание 1: Измерение ускорения по оси X, Y, Z

Пример считывания данных акселерометра по трем осям с использованием MPU6050.

cpp
#include <Wire.h> #include <MPU6050.h> MPU6050 mpu; void setup() { Serial.begin(9600); Wire.begin(); mpu.initialize(); if (!mpu.testConnection()) { Serial.println("Ошибка подключения к MPU6050"); while (1); } } void loop() { int16_t ax, ay, az; mpu.getAcceleration(&ax, &ay, &az); Serial.print("Ускорение X: "); Serial.print(ax); Serial.print(" Y: "); Serial.print(ay); Serial.print(" Z: "); Serial.println(az); delay(1000); }

Задание 2: Измерение углового положения

Использование гироскопа для измерения углового положения устройства.

Задание 3: Поворотный контроль

Программа для обнаружения поворота устройства по определенной оси и подачи сигнала при повороте.

Задание 4: Контроль положения объекта

Настройка для отслеживания наклона устройства в реальном времени.

Задание 5: Калибровка акселерометра и гироскопа

Программа для калибровки и настройки чувствительности MPU6050.

Сложные задания

Задание 1: Стабилизация робота с использованием акселерометра и гироскопа

Программа для стабилизации робота, предотвращающая его падение при изменении угла наклона.

Задание 2: Система мониторинга движения с передачей данных

Передача данных о движении и угловом положении на сервер для мониторинга.

28. Магнитометр (3-осевой магнитометр)

Базовые задания

Задание 1: Измерение магнитного поля по осям X, Y, Z

Считывание значений магнитного поля с 3-осевого магнитометра.

cpp
#include <Wire.h> #include <HMC5883L.h> HMC5883L magnetometer; void setup() { Serial.begin(9600); Wire.begin(); magnetometer.initialize(); if (!magnetometer.testConnection()) { Serial.println("Ошибка подключения к HMC5883L"); while (1); } } void loop() { Vector mag = magnetometer.getHeading(); Serial.print("Магнитное поле X: "); Serial.print(mag.XAxis); Serial.print(" Y: "); Serial.print(mag.YAxis); Serial.print(" Z: "); Serial.println(mag.ZAxis); delay(1000); }

Задание 2: Определение направления с помощью магнитометра

Использование значений осей для определения направления устройства относительно магнитного поля Земли.

Задание 3: Калибровка магнитометра

Программа для калибровки магнитометра, улучшая точность показаний.

Задание 4: Настройка для работы в качестве компаса

Использование магнитометра для реализации функции компаса, показывающего направления.

Задание 5: Измерение магнитного поля от ближайших объектов

Программа для измерения магнитного поля в зависимости от близости к магнитным объектам.

Сложные задания

Задание 1: Компас с визуальным отображением направлений

Создание устройства, которое отображает направления (N, S, E, W) на LCD-дисплее.

Задание 2: Система мониторинга геомагнитного поля

Передача данных о магнитном поле на сервер для мониторинга изменений в реальном времени.

Сенсоры для распознавания объектов HC-SR04: ультразвуковой сенсор для измерения расстояния. VL53L0X: лазерный сенсор расстояния. Сенсоры вращения TACHOMETER: сенсор для измерения угловой скорости. Сенсоры для управления RC-сервомодули: для управления сервомоторами. Модуль реле: для управления высоковольтными устройствами. Сенсоры для мониторинга состояния почвы Сенсор влажности почвы: для определения уровня влажности в почве. Сенсор pH почвы: для измерения кислотности почвы. Различные сенсоры TCS34725: сенсор цвета с RGB. AS7341: многоканальный сенсор цвета. MLX90640: сенсор для измерения температуры с помощью инфракрасного излучения. Сенсоры для роботов Датчики касания: для определения контакта с объектами. Сенсоры для отслеживания линии: используются в роботах для следования по линиям. Сенсоры для анализа данных NFC/RFID-сенсоры: для считывания информации с RFID-меток. GPIO-расширители: для увеличения числа доступных портов. Аудио и визуальные сенсоры CCD-матрицы: для захвата изображений. Модуль RGB-светодиодов: для управления цветами и светом. Дополнительные сенсоры Сенсоры обострения (tilt sensors): для определения наклона. Сенсоры водонепроницаемости: для работы в условиях повышенной влажности.
ChatGPT

29. Сенсоры для распознавания объектов

HC-SR04 (УЛЬТРАЗВУКОВОЙ СЕНСОР)

Базовые задания

Задание 1: Измерение расстояния

Использование ультразвукового сенсора для измерения расстояния до объекта.

cpp
#define TRIG_PIN 9 #define ECHO_PIN 10 void setup() { Serial.begin(9600); pinMode(TRIG_PIN, OUTPUT); pinMode(ECHO_PIN, INPUT); } void loop() { digitalWrite(TRIG_PIN, LOW); delayMicroseconds(2); digitalWrite(TRIG_PIN, HIGH); delayMicroseconds(10); digitalWrite(TRIG_PIN, LOW); long duration = pulseIn(ECHO_PIN, HIGH); float distance = (duration * 0.034) / 2; Serial.print("Расстояние: "); Serial.print(distance); Serial.println(" см"); delay(1000); }

Задание 2: Уведомление о препятствии

Подать звуковой сигнал, если объект ближе, чем 10 см.

Задание 3: Отображение расстояния на ЖК-дисплее

Вывод измеренного расстояния на LCD-дисплей.

Задание 4: Управление двигателем на основе расстояния

Включение/выключение двигателя в зависимости от расстояния до препятствия.

Задание 5: Автоматическое открытие двери

Открытие двери при обнаружении движения на расстоянии до 1 метра.

Сложные задания

Задание 1: Система парковки с измерением расстояния

Создание системы для измерения расстояния до объекта и вывода предупреждения о приближении.

Задание 2: Мобильная система с ультразвуковым датчиком

Использование ультразвукового сенсора для избегания препятствий роботом.

VL53L0X (ЛАЗЕРНЫЙ СЕНСОР)

Базовые задания

Задание 1: Измерение точного расстояния

Использование лазерного сенсора для измерения расстояния.

cpp
#include <Wire.h> #include <VL53L0X.h> VL53L0X sensor; void setup() { Serial.begin(9600); Wire.begin(); sensor.init(); sensor.setTimeout(500); } void loop() { uint16_t distance = sensor.readRangeSingleMillimeters(); Serial.print("Расстояние: "); Serial.print(distance); Serial.println(" мм"); delay(1000); }

Задание 2: Измерение расстояния до движущегося объекта

Мониторинг движущихся объектов с точностью лазера.

Задание 3: Система контроля расстояния на ЖК-дисплее

Вывод значений расстояния на LCD-дисплей для точного контроля.

Сложные задания

Задание 1: Лазерная система безопасности

Создание системы безопасности, которая обнаруживает движение с помощью лазера и подает сигнал тревоги.

30.

СЕНСОРЫ ВРАЩЕНИЯ

TACHOMETER (Датчик угловой скорости)

Базовые задания

Задание 1: Измерение скорости вращения

Использование тахометра для измерения скорости вращения двигателя.

cpp
#define SENSOR_PIN 2 volatile int pulseCount = 0; unsigned long lastTime = 0; void setup() { Serial.begin(9600); attachInterrupt(digitalPinToInterrupt(SENSOR_PIN), countPulse, RISING); } void loop() { unsigned long currentTime = millis(); if (currentTime - lastTime >= 1000) { float rpm = pulseCount * 60; // Примерная калибровка для RPM Serial.print("Скорость: "); Serial.print(rpm); Serial.println(" об/мин"); pulseCount = 0; lastTime = currentTime; } } void countPulse() { pulseCount++; }

Сложные задания

Задание 1: Управление скоростью двигателя

Использование тахометра для контроля и регулировки скорости вращения двигателя с помощью PID-контроля.

31. Сенсоры для управления

RC-сервомодули

Базовые задания

Задание 1: Управление углом сервомотора

Использование потенциометра для управления углом сервомотора.

cpp
#include <Servo.h> Servo servo; int potPin = A0; void setup() { servo.attach(9); } void loop() { int val = analogRead(potPin); int angle = map(val, 0, 1023, 0, 180); servo.write(angle); delay(15); }

Модуль реле

Базовые задания

Задание 1: Управление освещением с помощью реле

Пример использования реле для управления лампой.

cpp
#define RELAY_PIN 7 void setup() { pinMode(RELAY_PIN, OUTPUT); } void loop() { digitalWrite(RELAY_PIN, HIGH); // Включить реле delay(1000); digitalWrite(RELAY_PIN, LOW); // Выключить реле delay(1000); }

32.

СЕНСОРЫ ДЛЯ МОНИТОРИНГА СОСТОЯНИЯ ПОЧВЫ

Сенсор влажности почвы

Базовые задания

Задание 1: Измерение влажности почвы

Пример использования датчика влажности почвы.

cpp
#define SOIL_PIN A0 void setup() { Serial.begin(9600); } void loop() { int moisture = analogRead(SOIL_PIN); Serial.print("Влажность почвы: "); Serial.println(moisture); delay(1000); }

Сенсор pH почвы

Базовые задания

Задание 1: Измерение уровня pH почвы

Использование pH-датчика для измерения кислотности почвы и вывода значений.

33. Различные сенсоры

TCS34725 (RGB сенсор цвета)

Базовые задания

Задание 1: Измерение цветов

Считывание данных с сенсора для определения цветов объектов.

34. Сенсоры для роботов

Датчики касания

Базовые задания

Задание 1: Обнаружение столкновений роботом

Пример использования датчика касания для остановки робота при столкновении.

35. Сенсоры для анализа данных

NFC/RFID-сенсоры

Базовые задания

Задание 1: Чтение RFID метки

Пример использования RFID-датчика для считывания идентификаторов меток.

cpp
#include <SPI.h> #include <MFRC522.h> #define SS_PIN 10 #define RST_PIN 9 MFRC522 rfid(SS_PIN, RST_PIN); void setup() { Serial.begin(9600); SPI.begin(); rfid.PCD_Init(); } void loop() { if (!rfid.PICC_IsNewCardPresent()) return; if (!rfid.PICC_ReadCardSerial()) return; Serial.print("RFID метка: "); for (byte i = 0; i < rfid.uid.size; i++) { Serial.print(rfid.uid.uidByte[i], HEX); } Serial.println(); rfid.PICC_HaltA(); }
продолжи
ChatGPT

36.

АУДИО И ВИЗУАЛЬНЫЕ СЕНСОРЫ

CCD-матрицы

Базовые задания

Задание 1: Захват изображения

Использование CCD-матрицы для захвата и отображения изображения.

cpp
#include <Camera.h> void setup() { Serial.begin(9600); Camera.begin(); } void loop() { Camera.capture(); Serial.println("Изображение захвачено"); delay(5000); // Ждем перед следующей съемкой }

Модуль RGB-светодиодов

Базовые задания

Задание 1: Управление цветами RGB-светодиода

Использование PWM для управления цветами RGB-светодиода.

cpp
#define RED_PIN 9 #define GREEN_PIN 10 #define BLUE_PIN 11 void setup() { pinMode(RED_PIN, OUTPUT); pinMode(GREEN_PIN, OUTPUT); pinMode(BLUE_PIN, OUTPUT); } void loop() { // Включаем красный analogWrite(RED_PIN, 255); analogWrite(GREEN_PIN, 0); analogWrite(BLUE_PIN, 0); delay(1000); // Включаем зеленый analogWrite(RED_PIN, 0); analogWrite(GREEN_PIN, 255); analogWrite(BLUE_PIN, 0); delay(1000); // Включаем синий analogWrite(RED_PIN, 0); analogWrite(GREEN_PIN, 0); analogWrite(BLUE_PIN, 255); delay(1000); }

37.

ДОПОЛНИТЕЛЬНЫЕ СЕНСОРЫ

Сенсоры наклона (Tilt Sensors)

Базовые задания

Задание 1: Обнаружение наклона

Использование датчика наклона для определения положения.

cpp
#define TILT_PIN 2 void setup() { Serial.begin(9600); pinMode(TILT_PIN, INPUT); } void loop() { int tiltState = digitalRead(TILT_PIN); if (tiltState == HIGH) { Serial.println("Датчик наклона активирован"); } else { Serial.println("Датчик наклона не активирован"); } delay(1000); }

Сенсоры водонепроницаемости

Базовые задания

Задание 1: Обнаружение воды

Использование датчика для обнаружения наличия воды в среде.

cpp
#define WATER_SENSOR_PIN 3 void setup() { Serial.begin(9600); pinMode(WATER_SENSOR_PIN, INPUT); } void loop() { int waterState = digitalRead(WATER_SENSOR_PIN); if (waterState == HIGH) { Serial.println("Вода обнаружена"); } else { Serial.println("Вода не обнаружена"); } delay(1000); }

38.

СЕНСОРЫ ДЛЯ МОНИТОРИНГА ОКРУЖАЮЩЕЙ СРЕДЫ

SDS011 (Сенсор качества воздуха)

Базовые задания

Задание 1: Измерение PM2.5 и PM10

Использование сенсора для измерения качества воздуха.

cpp
#include <SoftwareSerial.h> SoftwareSerial mySerial(10, 11); // RX, TX void setup() { Serial.begin(9600); mySerial.begin(9600); } void loop() { if (mySerial.available()) { int pm25 = mySerial.read(); // Чтение PM2.5 int pm10 = mySerial.read(); // Чтение PM10 Serial.print("PM2.5: "); Serial.print(pm25); Serial.print(" µg/m³, PM10: "); Serial.print(pm10); Serial.println(" µg/m³"); } delay(1000); }

MH-Z19 (Сенсор CO2)

Базовые задания

Задание 1: Измерение уровня углекислого газа

Использование сенсора для мониторинга уровня CO2.

cpp
#include <SoftwareSerial.h> SoftwareSerial mySerial(10, 11); // RX, TX void setup() { Serial.begin(9600); mySerial.begin(9600); } void loop() { if (mySerial.available()) { int co2 = mySerial.read(); // Чтение CO2 Serial.print("Уровень CO2: "); Serial.print(co2); Serial.println(" ppm"); } delay(1000); }

БАЗОВЫЕ ЗАДАНИЯ С СЕРВОМОДУЛЯМИ

Задание 1: Угол поворота сервомотора

Описание: Использовать сервомотор для управления углом поворота от 0 до 180 градусов.

cpp
#include <Servo.h> Servo myServo; // Создаем объект для управления сервомотором void setup() { myServo.attach(9); // Подключаем сервомотор к пину 9 } void loop() { // Поворачиваем сервомотор от 0 до 180 градусов for (int angle = 0; angle <= 180; angle += 1) { myServo.write(angle); // Устанавливаем угол delay(15); // Задержка для плавности движения } // Поворачиваем сервомотор от 180 до 0 градусов for (int angle = 180; angle >= 0; angle -= 1) { myServo.write(angle); delay(15); } }

Задание 2: Управление сервомотором с помощью потенциометра

Описание: Использовать потенциометр для управления углом поворота сервомотора.

cpp
#include <Servo.h> Servo myServo; // Создаем объект для управления сервомотором int potPin = A0; // Пин для подключения потенциометра void setup() { myServo.attach(9); // Подключаем сервомотор к пину 9 } void loop() { int potValue = analogRead(potPin); // Читаем значение с потенциометра int angle = map(potValue, 0, 1023, 0, 180); // Преобразуем значение в угол myServo.write(angle); // Устанавливаем угол сервомотора delay(15); // Задержка для плавности движения }

Задание 3: Поворот сервомотора по команде с Serial

Описание: Использовать последовательный порт для управления углом сервомотора.

cpp
#include <Servo.h> Servo myServo; // Создаем объект для управления сервомотором void setup() { myServo.attach(9); // Подключаем сервомотор к пину 9 Serial.begin(9600); // Запускаем последовательный порт } void loop() { if (Serial.available() > 0) { int angle = Serial.parseInt(); // Читаем угол из последовательного порта if (angle >= 0 && angle <= 180) { myServo.write(angle); // Устанавливаем угол } } }

Задание 4: Автоматическое движение сервомотора

Описание: Серво двигается между 0 и 180 градусами через равные промежутки времени.

cpp
#include <Servo.h> Servo myServo; void setup() { myServo.attach(9); // Подключаем сервомотор к пину 9 } void loop() { for (int angle = 0; angle <= 180; angle += 10) { myServo.write(angle); // Поворачиваем сервомотор delay(500); // Задержка между движениями } for (int angle = 180; angle >= 0; angle -= 10) { myServo.write(angle); delay(500); } }

Задание 5: Сервомотор как замок

Описание: Использовать сервомотор для открытия и закрытия замка.

cpp
#include <Servo.h> Servo lockServo; void setup() { lockServo.attach(9); // Подключаем сервомотор к пину 9 } void loop() { lockServo.write(0); // Закрыть замок delay(2000); // Держим замок закрытым 2 секунды lockServo.write(90); // Открыть замок delay(2000); // Держим замок открытым 2 секунды }

Сложные задания с сервомодулями

Задание 1: Позиционирование по углу с помощью гироскопа

Описание: Использовать гироскоп для управления углом поворота сервомотора.

cpp
#include <Servo.h> #include <Wire.h> #include <MPU6050.h> Servo myServo; // Создаем объект для управления сервомотором MPU6050 mpu; void setup() { Serial.begin(9600); myServo.attach(9); // Подключаем сервомотор к пину 9 Wire.begin(); mpu.initialize(); } void loop() { int16_t ax, ay, az; mpu.getAcceleration(&ax, &ay, &az); int angle = map(ax, -17000, 17000, 0, 180); // Преобразуем данные акселерометра в угол myServo.write(angle); // Устанавливаем угол сервомотора delay(100); }

Задание 2: Система автоматического наведения

Описание: Сервомотор автоматически наводится на источник звука.

cpp
#include <Servo.h> Servo myServo; // Создаем объект для управления сервомотором int micPin = A0; // Пин для подключения микрофона void setup() { myServo.attach(9); // Подключаем сервомотор к пину 9 } void loop() { int soundLevel = analogRead(micPin); // Читаем уровень звука int angle = map(soundLevel, 0, 1023, 0, 180); // Преобразуем уровень звука в угол myServo.write(angle); // Устанавливаем угол сервомотора delay(100); }

Задание 3: Серво для управления роботом

Описание: Использование нескольких сервомоторов для управления движением робота.

cpp
#include <Servo.h> Servo leftServo; Servo rightServo; void setup() { leftServo.attach(9); // Подключаем левый сервомотор rightServo.attach(10); // Подключаем правый сервомотор } void loop() { leftServo.write(180); // Вперед rightServo.write(0); delay(1000); // Двигаться вперед 1 секунду leftServo.write(0); // Назад rightServo.write(180); delay(1000); // Двигаться назад 1 секунду }

Задание 4: Система управления с помощью веб-интерфейса

Описание: Использование сервомотора, управляемого через веб-интерфейс.

cpp
#include <Servo.h> #include <ESP8266WiFi.h> Servo myServo; void setup() { Serial.begin(115200); myServo.attach(9); // Подключаем сервомотор // Настройка Wi-Fi } void loop() { // Логика для обработки запросов и управления сервомотором }

Задание 5: Система следования за движением

Описание: Сервомотор следует за движущимися объектами с помощью ультразвукового сенсора.

cpp
#include <Servo.h> Servo myServo; #define TRIG_PIN 9 #define ECHO_PIN 10 void setup() { myServo.attach(11); // Подключаем сервомотор pinMode(TRIG_PIN, OUTPUT); pinMode(ECHO_PIN, INPUT); } void loop() { // Логика для измерения расстояния и поворота сервомотора в зависимости от движения }

ChatGPT

КОМБИНАЦИЯ ДАТЧИКОВ, СЕРВОМОТОРОВ, КНОПОК, СВЕТОДИОДОВ И ДРУГИХ КОМПОНЕНТОВ.

Задания расположены по нарастающей сложности.

Базовые задания (1-10)

  1. Управление LED с кнопкойКогда кнопка нажата, светодиод загорается.

    cpp
    const int ledPin = 13; const int buttonPin = 2; int buttonState = 0; void setup() { pinMode(ledPin, OUTPUT); pinMode(buttonPin, INPUT); } void loop() { buttonState = digitalRead(buttonPin); if (buttonState == HIGH) { digitalWrite(ledPin, HIGH); } else { digitalWrite(ledPin, LOW); } }
  2. Мигание светодиодаСветодиод мигает с заданным интервалом времени.

    cpp
    const int ledPin = 13; void setup() { pinMode(ledPin, OUTPUT); } void loop() { digitalWrite(ledPin, HIGH); delay(1000); digitalWrite(ledPin, LOW); delay(1000); }
  3. Управление сервомотором кнопкойКогда нажата кнопка, сервомотор поворачивается на 90 градусов.

    cpp
    #include <Servo.h> Servo myServo; const int buttonPin = 2; int buttonState = 0; void setup() { myServo.attach(9); pinMode(buttonPin, INPUT); } void loop() { buttonState = digitalRead(buttonPin); if (buttonState == HIGH) { myServo.write(90); } else { myServo.write(0); } }
  4. Диммер на потенциометреИспользование потенциометра для регулировки яркости светодиода.

    cpp
    const int ledPin = 9; const int potPin = A0; void setup() { pinMode(ledPin, OUTPUT); } void loop() { int potValue = analogRead(potPin); int brightness = map(potValue, 0, 1023, 0, 255); analogWrite(ledPin, brightness); }
  5. Тональность звука с пьезоИзменение тона пьезодинамика в зависимости от положения потенциометра.

    cpp
    const int piezoPin = 8; const int potPin = A0; void setup() {} void loop() { int potValue = analogRead(potPin); int toneValue = map(potValue, 0, 1023, 100, 1000); tone(piezoPin, toneValue); }
  6. Простой таймер с кнопкой и светодиодомКнопка запускает таймер на 5 секунд, по истечении которых загорается светодиод.

    cpp
    const int ledPin = 13; const int buttonPin = 2; int buttonState = 0; unsigned long timerStart; void setup() { pinMode(ledPin, OUTPUT); pinMode(buttonPin, INPUT); } void loop() { buttonState = digitalRead(buttonPin); if (buttonState == HIGH) { timerStart = millis(); while (millis() - timerStart < 5000) {} digitalWrite(ledPin, HIGH); delay(1000); digitalWrite(ledPin, LOW); } }
  7. Управление LED с помощью PIR сенсораLED включается, когда PIR сенсор обнаруживает движение.

    cpp
    const int ledPin = 13; const int pirPin = 2; int pirState = 0; void setup() { pinMode(ledPin, OUTPUT); pinMode(pirPin, INPUT); } void loop() { pirState = digitalRead(pirPin); if (pirState == HIGH) { digitalWrite(ledPin, HIGH); } else { digitalWrite(ledPin, LOW); } }
  8. Простая система сигнализацииПьезо издает сигнал, когда PIR сенсор обнаруживает движение.

    cpp
    const int buzzerPin = 8; const int pirPin = 2; int pirState = 0; void setup() { pinMode(buzzerPin, OUTPUT); pinMode(pirPin, INPUT); } void loop() { pirState = digitalRead(pirPin); if (pirState == HIGH) { tone(buzzerPin, 1000); delay(1000); noTone(buzzerPin); } }
  9. Контроль сервомотора с помощью потенциометраПоворачиваем сервомотор в зависимости от позиции потенциометра.

    cpp
    #include <Servo.h> Servo myServo; const int potPin = A0; void setup() { myServo.attach(9); } void loop() { int potValue = analogRead(potPin); int angle = map(potValue, 0, 1023, 0, 180); myServo.write(angle); }
  10. Индикатор уровня звука с пьезо и светодиодомЕсли уровень шума выше определенного порога, включается светодиод.

cpp
const int ledPin = 13; const int micPin = A0; int soundLevel; void setup() { pinMode(ledPin, OUTPUT); } void loop() { soundLevel = analogRead(micPin); if (soundLevel > 500) { digitalWrite(ledPin, HIGH); delay(100); digitalWrite(ledPin, LOW); } }

11. Секундомер с кнопкой и дисплеем

Это пример секундомера, который запускается при нажатии кнопки и отображает время на OLED дисплее.

cpp
#include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 32 #define OLED_RESET -1 Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); const int buttonPin = 2; unsigned long startTime; bool running = false; void setup() { pinMode(buttonPin, INPUT_PULLUP); display.begin(SSD1306_SWITCHCAPVCC, 0x3C); display.clearDisplay(); display.setTextSize(2); display.setTextColor(WHITE); } void loop() { if (digitalRead(buttonPin) == LOW) { delay(200); // Anti-bounce delay running = !running; if (running) { startTime = millis(); } } if (running) { unsigned long elapsedTime = millis() - startTime; display.clearDisplay(); display.setCursor(0, 10); display.print(elapsedTime / 1000); // Show seconds display.display(); } }

12. Звуковая сигнализация при падении с акселерометром

Когда акселерометр обнаруживает резкое изменение в значении осей, срабатывает звуковой сигнал.

cpp
#include <Wire.h> #include <Adafruit_MPU6050.h> #include <Adafruit_Sensor.h> Adafruit_MPU6050 mpu; const int buzzerPin = 8; float threshold = 1.5; void setup() { Serial.begin(115200); pinMode(buzzerPin, OUTPUT); if (!mpu.begin()) { Serial.println("MPU6050 не найден"); while (1); } } void loop() { sensors_event_t event; mpu.getAccelerometerSensor()->getEvent(&event); float ax = event.acceleration.x; float ay = event.acceleration.y; float az = event.acceleration.z; if (abs(ax) > threshold || abs(ay) > threshold || abs(az) > threshold) { tone(buzzerPin, 1000); delay(1000); noTone(buzzerPin); } delay(100); }

13. Управление яркостью RGB LED с тремя потенциометрами

Изменение каждого из трех цветов RGB-светодиода с помощью трех потенциометров.

cpp
const int redPin = 9; const int greenPin = 10; const int bluePin = 11; const int potRed = A0; const int potGreen = A1; const int potBlue = A2; void setup() { pinMode(redPin, OUTPUT); pinMode(greenPin, OUTPUT); pinMode(bluePin, OUTPUT); } void loop() { int redValue = map(analogRead(potRed), 0, 1023, 0, 255); int greenValue = map(analogRead(potGreen), 0, 1023, 0, 255); int blueValue = map(analogRead(potBlue), 0, 1023, 0, 255); analogWrite(redPin, redValue); analogWrite(greenPin, greenValue); analogWrite(bluePin, blueValue); }

14. Световая сигнализация с ультразвуковым сенсором

Если объект находится ближе определенного расстояния, светодиод загорается.

cpp
const int trigPin = 9; const int echoPin = 10; const int ledPin = 13; void setup() { pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); pinMode(ledPin, OUTPUT); Serial.begin(9600); } void loop() { long duration, distance; digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); distance = duration * 0.034 / 2; if (distance < 20) { digitalWrite(ledPin, HIGH); } else { digitalWrite(ledPin, LOW); } }

15. Сервоприводный механизм для открытия двери

Когда нажимается кнопка, сервомотор открывает "дверь" на 90 градусов.

cpp
#include <Servo.h> Servo servo; const int buttonPin = 2; void setup() { pinMode(buttonPin, INPUT); servo.attach(9); } void loop() { if (digitalRead(buttonPin) == HIGH) { servo.write(90); } else { servo.write(0); } }

16. Реакция на движение с PIR сенсором и светодиодами

Светодиод загорается, если PIR сенсор обнаруживает движение.

cpp
const int pirPin = 2; const int ledPin = 13; void setup() { pinMode(pirPin, INPUT); pinMode(ledPin, OUTPUT); } void loop() { if (digitalRead(pirPin) == HIGH) { digitalWrite(ledPin, HIGH); delay(2000); // LED stays on for 2 seconds } else { digitalWrite(ledPin, LOW); } }

17. Умный замок с RFID и сервомотором

RFID-считыватель проверяет, подходит ли карта. Если да, замок (сервопривод) открывается.

cpp
#include <SPI.h> #include <MFRC522.h> #include <Servo.h> #define RST_PIN 9 #define SS_PIN 10 MFRC522 rfid(SS_PIN, RST_PIN); Servo lockServo; void setup() { SPI.begin(); rfid.PCD_Init(); lockServo.attach(8); lockServo.write(0); // Закрыт } void loop() { if ( !rfid.PICC_IsNewCardPresent() || !rfid.PICC_ReadCardSerial() ) { return; } if (rfid.uid.uidByte[0] == 0xDE && rfid.uid.uidByte[1] == 0xAD) { // Проверка UID карты lockServo.write(90); // Открыть замок delay(5000); lockServo.write(0); // Закрыть замок } rfid.PICC_HaltA(); }

18. Анализ окружающей среды с сенсором температуры и LED

Светодиод мигает чаще при повышенной температуре.

cpp
const int tempPin = A0; const int ledPin = 13; void setup() { pinMode(ledPin, OUTPUT); } void loop() { int tempValue = analogRead(tempPin); int blinkDelay = map(tempValue, 0, 1023, 1000, 100); digitalWrite(ledPin, HIGH); delay(blinkDelay); digitalWrite(ledPin, LOW); delay(blinkDelay); }

19. Контроль температуры с терморезистором и вентилятором

Если температура выше порога, вентилятор включается.

cpp
const int tempPin = A0; const int fanPin = 9; int thresholdTemp = 600; void setup() { pinMode(fanPin, OUTPUT); } void loop() { int tempValue = analogRead(tempPin); if (tempValue > thresholdTemp) { digitalWrite(fanPin, HIGH); } else { digitalWrite(fanPin, LOW); } }

20. Сигнализация уровня воды с сенсором и пьезо

Когда уровень воды достигает заданного значения, включается звуковой сигнал.

cpp
const int waterSensorPin = A0; const int buzzerPin = 8; int waterLevelThreshold = 600; void setup() { pinMode(buzzerPin, OUTPUT); } void loop() { int waterLevel = analogRead(waterSensorPin); if (waterLevel > waterLevelThreshold) { tone(buzzerPin, 1000); } else { noTone(buzzerPin); } }

21. Мини-робот с сервомоторами и ультразвуковым датчиком

Робот с ультразвуковым сенсором движется вперед, и, если он обнаруживает препятствие на расстоянии меньше 15 см, он поворачивает в сторону.

cpp
#include <Servo.h> Servo leftServo; Servo rightServo; const int trigPin = 9; const int echoPin = 10; void setup() { leftServo.attach(5); rightServo.attach(6); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); } void loop() { long distance = getDistance(); if (distance < 15) { turnRight(); } else { moveForward(); } delay(100); } long getDistance() { digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); long duration = pulseIn(echoPin, HIGH); return duration * 0.034 / 2; } void moveForward() { leftServo.write(180); rightServo.write(0); } void turnRight() { leftServo.write(180); rightServo.write(180); delay(500); }

22. Умный дом: управление освещением и температурой

Освещение включается при низком уровне освещенности, а вентилятор — при повышенной температуре.

cpp
const int lightSensorPin = A0; const int tempSensorPin = A1; const int ledPin = 13; const int fanPin = 9; void setup() { pinMode(ledPin, OUTPUT); pinMode(fanPin, OUTPUT); } void loop() { int lightLevel = analogRead(lightSensorPin); int tempValue = analogRead(tempSensorPin); if (lightLevel < 500) { // Если темно digitalWrite(ledPin, HIGH); } else { digitalWrite(ledPin, LOW); } if (tempValue > 600) { // Если жарко digitalWrite(fanPin, HIGH); } else { digitalWrite(fanPin, LOW); } delay(100); }

23. Автономный полив растений с датчиком влажности

Поливной насос включается, если уровень влажности почвы ниже установленного порога.

cpp
const int soilSensorPin = A0; const int pumpPin = 9; int moistureThreshold = 300; void setup() { pinMode(pumpPin, OUTPUT); } void loop() { int moistureLevel = analogRead(soilSensorPin); if (moistureLevel < moistureThreshold) { digitalWrite(pumpPin, HIGH); // Включить насос delay(5000); // Полив в течение 5 секунд digitalWrite(pumpPin, LOW); // Остановить насос } delay(1000); // Пауза между проверками }

24. Автоматический дозатор с сервомотором

Сервопривод контролирует крышку дозатора, открывая ее на определенное время.

cpp
#include <Servo.h> Servo servo; const int buttonPin = 2; void setup() { servo.attach(9); pinMode(buttonPin, INPUT_PULLUP); } void loop() { if (digitalRead(buttonPin) == LOW) { servo.write(90); // Открыть delay(2000); servo.write(0); // Закрыть delay(1000); } }

25. Система анти-кражи с несколькими сенсорами

Используя PIR-сенсор для обнаружения движения и светодиоды для сигнализации, система срабатывает, когда сенсор обнаруживает движение.

cpp
const int pirPin = 2; const int ledPin = 13; const int buzzerPin = 8; void setup() { pinMode(pirPin, INPUT); pinMode(ledPin, OUTPUT); pinMode(buzzerPin, OUTPUT); } void loop() { if (digitalRead(pirPin) == HIGH) { digitalWrite(ledPin, HIGH); tone(buzzerPin, 1000); delay(5000); digitalWrite(ledPin, LOW); noTone(buzzerPin); } }

26. Контроль влажности воздуха в помещении

С помощью датчика влажности управляется вентилятор. Если уровень влажности превышает порог, вентилятор включается.

cpp
#include <DHT.h> #define DHTPIN 2 #define DHTTYPE DHT11 DHT dht(DHTPIN, DHTTYPE); const int fanPin = 9; void setup() { dht.begin(); pinMode(fanPin, OUTPUT); } void loop() { float humidity = dht.readHumidity(); if (humidity > 70) { digitalWrite(fanPin, HIGH); } else { digitalWrite(fanPin, LOW); } delay(1000); }

27. Автоматическое освещение при заходе солнца

Светодиод включается при низком уровне освещенности, а при дневном освещении автоматически выключается.

cpp
const int lightSensorPin = A0; const int ledPin = 13; void setup() { pinMode(ledPin, OUTPUT); } void loop() { int lightLevel = analogRead(lightSensorPin); if (lightLevel < 500) { digitalWrite(ledPin, HIGH); } else { digitalWrite(ledPin, LOW); } delay(500); }

28. Система паркинга с ультразвуковыми датчиками

С помощью ультразвукового сенсора измеряется расстояние до ближайшего объекта. Если оно меньше порогового значения, загорается светодиод.

cpp
const int trigPin = 9; const int echoPin = 10; const int ledPin = 13; void setup() { pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); pinMode(ledPin, OUTPUT); } void loop() { long distance = getDistance(); if (distance < 20) { digitalWrite(ledPin, HIGH); } else { digitalWrite(ledPin, LOW); } delay(100); } long getDistance() { digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); long duration = pulseIn(echoPin, HIGH); return duration * 0.034 / 2; }

29. Реакция на шум с записью на дисплей

Если уровень шума превышает заданный порог, информация о нем отображается на OLED дисплее.

cpp
#include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 32 #define OLED_RESET -1 Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); const int micPin = A0; int noiseThreshold = 500; void setup() { display.begin(SSD1306_SWITCHCAPVCC, 0x3C); display.clearDisplay(); display.setTextSize(2); display.setTextColor(WHITE); } void loop() { int noiseLevel = analogRead(micPin); display.clearDisplay(); if (noiseLevel > noiseThreshold) { display.setCursor(0, 10); display.print("Noise Detected!"); } else { display.setCursor(0, 10); display.print("Quiet"); } display.display(); delay(500); }

30. Метеостанция с дисплеем для отображения данных

Метеостанция, которая собирает и отображает данные о температуре, влажности и давлении.

cpp
#include <Wire.h> #include <Adafruit_Sensor.h> #include <Adafruit_BMP280.h> #include <Adafruit_SSD1306.h> #include <DHT.h> #define DHTPIN 2 #define DHTTYPE DHT11 DHT dht(DHTPIN, DHTTYPE); Adafruit_BMP280 bmp; Adafruit_SSD1306 display(128, 64, &Wire); void setup() { dht.begin(); bmp.begin(0x76); display.begin(SSD1306_SWITCHCAPVCC, 0x3C); } void loop() { float temperature = dht.readTemperature(); float humidity = dht.readHumidity(); float pressure = bmp.readPressure() / 100.0F; display.clearDisplay(); display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(0, 0); display.print("Temp: "); display.print(temperature); display.println(" C"); display.setCursor(0, 10); display.print("Humidity: "); display.print(humidity); display.println(" %"); display.setCursor(0, 20); display.print("Pressure: "); display.print(pressure); display.println(" hPa"); display.display(); delay(2000); }

31. Робот с управлением на основе звуковых команд

Создайте робота, который реагирует на простые команды, такие как "вперёд", "назад", "стоп". Используйте модуль для распознавания звука (например, KY-038) для захвата звуковых сигналов и сервоприводы для движения.

Пример кода:

cpp
#include <Servo.h> Servo leftServo; Servo rightServo; const int soundPin = A0; int soundThreshold = 600; void setup() { leftServo.attach(5); rightServo.attach(6); pinMode(soundPin, INPUT); Serial.begin(9600); } void loop() { int soundLevel = analogRead(soundPin); if (soundLevel > soundThreshold) { moveForward(); delay(1000); stop(); } else { stop(); } } void moveForward() { leftServo.write(180); rightServo.write(0); } void stop() { leftServo.write(90); rightServo.write(90); }

32. Система распознавания объектов с камерой и сервомотором

Используя камеру OV7670 и сервомотор, создайте систему, которая будет обнаруживать объекты и поворачивать камеру к ним. Код для Arduino будет поддерживать вращение камеры.

Пример кода:

cpp
#include <Servo.h> Servo cameraServo; const int trigPin = 9; const int echoPin = 10; int distance; void setup() { cameraServo.attach(3); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); Serial.begin(9600); } void loop() { distance = getDistance(); if (distance < 30) { for (int pos = 0; pos <= 180; pos += 10) { cameraServo.write(pos); delay(100); } } } long getDistance() { digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); long duration = pulseIn(echoPin, HIGH); return duration * 0.034 / 2; }

33. Сигнализация утечки газа и оповещение

Используйте датчик газа MQ-2 для обнаружения утечек газа и светодиод для оповещения. При обнаружении высокой концентрации газа отправьте уведомление на телефон через ESP8266.

Пример кода:

cpp
#include <ESP8266WiFi.h> const int gasSensorPin = A0; const int ledPin = 13; int gasThreshold = 300; void setup() { pinMode(gasSensorPin, INPUT); pinMode(ledPin, OUTPUT); Serial.begin(9600); WiFi.begin("SSID", "PASSWORD"); while (WiFi.status() != WL_CONNECTED) { delay(500); } } void loop() { int gasLevel = analogRead(gasSensorPin); if (gasLevel > gasThreshold) { digitalWrite(ledPin, HIGH); sendNotification(); } else { digitalWrite(ledPin, LOW); } delay(1000); } void sendNotification() { // Пример отправки HTTP-запроса на сервер для уведомления }

34. Робот для измерения параметров окружающей среды

Создайте робота на базе Arduino, оснащенного датчиками температуры, влажности, CO2 и PM2.5. Робот может передавать собранные данные на смартфон через Bluetooth.

Пример кода:

cpp
#include <DHT.h> #include <SoftwareSerial.h> DHT dht(2, DHT11); SoftwareSerial BTSerial(10, 11); // RX, TX для Bluetooth void setup() { Serial.begin(9600); BTSerial.begin(9600); dht.begin(); } void loop() { float humidity = dht.readHumidity(); float temperature = dht.readTemperature(); BTSerial.print("Temp: "); BTSerial.print(temperature); BTSerial.print("C, Humidity: "); BTSerial.print(humidity); BTSerial.println("%"); delay(2000); }

35. Модульный робот с управлением жестами

С использованием датчика акселерометра и сервоприводов создайте робота, который двигается в зависимости от жестов (например, наклонов контроллера).

Пример кода:

cpp
#include <Servo.h> #include <Wire.h> #include <MPU6050.h> MPU6050 mpu; Servo servo1, servo2; void setup() { Wire.begin(); mpu.initialize(); servo1.attach(9); servo2.attach(10); } void loop() { int16_t ax, ay, az; mpu.getAcceleration(&ax, &ay, &az); if (ax > 10000) { servo1.write(0); // Поворот в одну сторону servo2.write(0); } else if (ax < -10000) { servo1.write(180); // Поворот в другую сторону servo2.write(180); } else { servo1.write(90); servo2.write(90); } delay(500); }

36. Машинное обучение для распознавания звуков

Используя Arduino и TinyML, создайте проект, который различает разные типы звуков и реагирует на них.

К примеру, для этого можно использовать Arduino Nano 33 BLE Sense и обученную модель ML.

37. Контроль движения с акселерометром и гироскопом

Используя MPU6050, отслеживайте изменение положения объекта и отображайте данные на OLED-дисплее.

Пример кода:

cpp
#include <Wire.h> #include <MPU6050.h> #include <Adafruit_SSD1306.h> MPU6050 mpu; Adafruit_SSD1306 display(128, 32, &Wire); void setup() { Wire.begin(); mpu.initialize(); display.begin(SSD1306_SWITCHCAPVCC, 0x3C); } void loop() { int16_t ax, ay, az; mpu.getAcceleration(&ax, &ay, &az); display.clearDisplay(); display.setTextSize(1); display.setCursor(0, 0); display.print("AX: "); display.print(ax); display.print(" AY: "); display.print(ay); display.display(); delay(500); }

38. Система учета посетителей с RFID и дисплеем

С помощью RFID и OLED-дисплея создайте систему, которая распознает метки RFID и отслеживает количество посетителей.

Пример кода:

cpp
#include <Wire.h> #include <MFRC522.h> #include <Adafruit_SSD1306.h> MFRC522 mfrc522(10, 9); Adafruit_SSD1306 display(128, 32, &Wire); int count = 0; void setup() { SPI.begin(); mfrc522.PCD_Init(); display.begin(SSD1306_SWITCHCAPVCC, 0x3C); } void loop() { if (mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial()) { count++; display.clearDisplay(); display.setTextSize(1); display.setCursor(0, 0); display.print("Visitors: "); display.print(count); display.display(); delay(1000); } }

39. Домашний питомец с интерактивным поведением

Создайте робота-питомца, который реагирует на прикосновения, звук и движения пользователя. Можете использовать датчик касания, микрофон и сервоприводы для управления движением.

40. Эко-станция для автоматизированного ухода за растениями

Эта станция включает датчики влажности, температуры и освещения. В зависимости от условий, станция активирует полив или освещение для поддержки роста растения.

cpp
#include <DHT.h> #include <Servo.h> DHT dht(2, DHT11); Servo pumpServo; const int lightSensorPin = A0; const int soilSensorPin = A1; int lightThreshold = 500; int moistureThreshold = 300; void setup() { dht.begin(); pumpServo.attach(9); } void loop() { int lightLevel = analogRead(lightSensorPin); int moistureLevel = analogRead(soilSensorPin); float temperature = dht.readTemperature(); if (lightLevel < lightThreshold) { // Включить свет } if (moistureLevel < moistureThreshold) { pumpServo.write(90); delay(5000); pumpServo.write(0); } delay(2000); }

1. Управление углом наклона сервомотора с помощью потенциометра

Описание: Подключите потенциометр и сервомотор так, чтобы угол наклона сервомотора изменялся при вращении ручки потенциометра.

Схема подключения:

  • Пин сигнала потенциометра к аналоговому пину A0
  • Пин сигнала сервомотора к цифровому пину 9
  • Питание и земля подключены соответствующим образом

Код:

cpp
#include <Servo.h> // Подключаем библиотеку Servo Servo myServo; // Создаём объект сервомотора int potPin = A0; // Пин, к которому подключён потенциометр int potValue; // Переменная для хранения значения потенциометра int servoAngle; // Переменная для угла сервомотора void setup() { myServo.attach(9); // Подключаем сервомотор к пину 9 } void loop() { potValue = analogRead(potPin); // Считываем значение с потенциометра servoAngle = map(potValue, 0, 1023, 0, 180); // Преобразуем значение в угол от 0 до 180 myServo.write(servoAngle); // Устанавливаем угол сервомотора delay(15); // Задержка для плавного движения }

2. Простая световая сигнализация с сервомотором и светодиодом

Описание: Включите светодиод, когда сервопривод достигнет заданного угла, и выключите его при возврате в исходное положение.

Схема подключения:

  • Пин сигнала сервомотора к цифровому пину 9
  • Светодиод к цифровому пину 10 через резистор

Код:

cpp
#include <Servo.h> // Подключаем библиотеку Servo Servo myServo; int ledPin = 10; // Пин, к которому подключён светодиод int servoAngle = 0; void setup() { myServo.attach(9); // Подключаем сервомотор pinMode(ledPin, OUTPUT); // Настраиваем светодиод как выход } void loop() { myServo.write(90); // Устанавливаем сервомотор на 90 градусов digitalWrite(ledPin, HIGH); // Включаем светодиод delay(1000); // Ждём 1 секунду myServo.write(0); // Возвращаем сервомотор в 0 градусов digitalWrite(ledPin, LOW); // Выключаем светодиод delay(1000); // Ждём 1 секунду }

3. Двусторонний флажок с сервомотором

Описание: Используйте сервомотор для подъема и опускания мини-флажка. Изменяйте положение флажка с интервалом времени.

Схема подключения:

  • Пин сигнала сервомотора к цифровому пину 9

Код:

cpp
#include <Servo.h> // Подключаем библиотеку Servo Servo myServo; void setup() { myServo.attach(9); // Подключаем сервомотор } void loop() { myServo.write(180); // Поднимаем флажок delay(2000); // Ждем 2 секунды myServo.write(0); // Опускаем флажок delay(2000); // Ждем 2 секунды }

4. Поворот указателя по нажатию кнопки

Описание: При нажатии кнопки сервомотор меняет угол наклона, а при повторном нажатии возвращается в исходное положение.

Схема подключения:

  • Кнопка к цифровому пину 2
  • Пин сигнала сервомотора к цифровому пину 9

Код:

cpp
#include <Servo.h> Servo myServo; int buttonPin = 2; // Пин для кнопки bool buttonState = false; // Состояние кнопки bool lastButtonState = false; // Предыдущее состояние кнопки void setup() { myServo.attach(9); // Подключаем сервомотор pinMode(buttonPin, INPUT_PULLUP); // Настраиваем пин кнопки } void loop() { buttonState = digitalRead(buttonPin); // Читаем состояние кнопки // Проверяем, было ли нажатие if (buttonState == LOW && lastButtonState == HIGH) { static bool servoPos = false; // Переключатель для позиции servoPos = !servoPos; // Меняем позицию if (servoPos) { myServo.write(90); // Устанавливаем на 90 градусов } else { myServo.write(0); // Возвращаем в 0 градусов } delay(200); // Задержка, чтобы избежать дребезга } lastButtonState = buttonState; // Сохраняем предыдущее состояние }

5. Автоматический вентилятор с сервоприводом

Описание: Используйте сервомотор для управления маленьким вентилятором, включающимся при достижении определенной температуры с датчиком DHT11.

Схема подключения:

  • Датчик DHT11 к цифровому пину 7
  • Пин сигнала сервомотора к цифровому пину 9

Код:

cpp
#include <DHT.h> #include <Servo.h> #define DHTPIN 7 // Пин для DHT11 #define DHTTYPE DHT11 // Тип DHT DHT dht(DHTPIN, DHTTYPE); Servo myServo; int thresholdTemp = 30; // Пороговая температура void setup() { Serial.begin(9600); dht.begin(); myServo.attach(9); // Подключаем сервомотор } void loop() { float humidity = dht.readHumidity(); // Считываем влажность float temperature = dht.readTemperature(); // Считываем температуру if (temperature > thresholdTemp) { myServo.write(180); // Включаем вентилятор } else { myServo.write(0); // Выключаем вентилятор } delay(2000); // Ждем 2 секунды перед следующим считыванием }

Это первые пять задач. Если вам нужно продолжение, дайте знать, и я продолжу с другими заданиями!

продолжи
ChatGPT

Отлично! Продолжим с шестой по десятую задачи.

6. Автоматическая кормушка для домашних животных

Описание: Используйте сервомотор для открытия и закрытия дверцы кормушки по расписанию. Можно добавить RTC (реальное время) для автоматизации.

Схема подключения:

  • Сервомотор к цифровому пину 9

Код:

cpp
#include <Servo.h> Servo myServo; int feedingTime = 12; // Время кормления в часах (12:00) int feedingDuration = 5000; // Продолжительность кормления в миллисекундах (5 секунд) void setup() { myServo.attach(9); // Подключаем сервомотор } void loop() { int currentHour = hour(); // Получаем текущий час if (currentHour == feedingTime) { myServo.write(90); // Открываем кормушку delay(feedingDuration); // Кормим в течение 5 секунд myServo.write(0); // Закрываем кормушку delay(3600000); // Ждем 1 час перед следующим кормлением } delay(1000); // Ждем 1 секунду перед следующим циклом }

7. Умный светильник с изменением яркости

Описание: Используйте сервомотор для изменения угла наклона светильника, чтобы управлять яркостью, в зависимости от значения с датчика освещенности.

Схема подключения:

  • Датчик света к аналоговому пину A0
  • Сервомотор к цифровому пину 9

Код:

cpp
#include <Servo.h> Servo myServo; int lightSensorPin = A0; // Пин для датчика света int servoAngle; void setup() { myServo.attach(9); // Подключаем сервомотор } void loop() { int lightValue = analogRead(lightSensorPin); // Считываем значение с датчика servoAngle = map(lightValue, 0, 1023, 0, 180); // Преобразуем в угол myServo.write(servoAngle); // Устанавливаем угол delay(1000); // Задержка для обновления }

8. Пульт управления сервомотором

Описание: Используйте инфракрасный приемник для управления сервомотором с пульта дистанционного управления.

Схема подключения:

  • Инфракрасный приемник к цифровому пину 11
  • Сервомотор к цифровому пину 9

Код:

cpp
#include <Servo.h> #include <IRremote.h> Servo myServo; IRrecv irrecv(11); // Пин для ИК-приемника decode_results results; void setup() { myServo.attach(9); // Подключаем сервомотор irrecv.enableIRIn(); // Включаем ИК-приемник } void loop() { if (irrecv.decode(&results)) { switch (results.value) { case 0xFFA25D: // Код кнопки "Вверх" (пример) myServo.write(90); // Устанавливаем на 90 градусов break; case 0xFF629D: // Код кнопки "Вниз" (пример) myServo.write(0); // Возвращаем в 0 градусов break; } irrecv.resume(); // Сбрасываем результат } }

9. Сервоприводный замок с использованием RFID

Описание: Управляйте замком, открывающимся при считывании RFID-метки.

Схема подключения:

  • RFID-модуль (например, MFRC522) к SPI
  • Сервомотор к цифровому пину 9

Код:

cpp
#include <SPI.h> #include <MFRC522.h> #include <Servo.h> #define SS_PIN 10 #define RST_PIN 9 MFRC522 rfid(SS_PIN, RST_PIN); // Создаем объект RFID Servo myServo; void setup() { Serial.begin(9600); SPI.begin(); rfid.PCD_Init(); myServo.attach(3); // Подключаем сервомотор } void loop() { if (rfid.PICC_IsNewCardPresent() && rfid.PICC_ReadCardSerial()) { if (rfid.uid.uidByte[0] == 0xDE && rfid.uid.uidByte[1] == 0xAD) { // Проверяем UID myServo.write(90); // Открываем замок delay(5000); // Открыт 5 секунд myServo.write(0); // Закрываем замок } rfid.PICC_HaltA(); // Останавливаем чтение } }

10. Дистанционное управление механизмом с помощью Bluetooth

Описание: Используйте модуль Bluetooth для управления сервомотором с мобильного телефона.

Схема подключения:

  • Модуль Bluetooth (например, HC-05) к последовательному порту
  • Сервомотор к цифровому пину 9

Код:

cpp
#include <Servo.h> Servo myServo; char command; void setup() { Serial.begin(9600); // Инициализация последовательного порта myServo.attach(9); // Подключаем сервомотор } void loop() { if (Serial.available()) { // Проверяем, есть ли данные command = Serial.read(); // Читаем команду if (command == '1') { myServo.write(90); // Устанавливаем на 90 градусов } else if (command == '0') { myServo.write(0); // Возвращаем в 0 градусов } } }

11. Автоматическая шторка

Описание: Управляйте шторкой, используя сервомотор для открытия и закрытия в зависимости от уровня освещенности.

Схема подключения:

  • Датчик освещенности к аналоговому пину A0
  • Сервомотор к цифровому пину 9

Код:

cpp
#include <Servo.h> Servo myServo; int lightSensorPin = A0; // Пин для датчика света int servoPosition; void setup() { myServo.attach(9); // Подключаем сервомотор } void loop() { int lightValue = analogRead(lightSensorPin); // Считываем значение с датчика if (lightValue < 512) { // Если темно myServo.write(90); // Открываем шторки } else { // Если светло myServo.write(0); // Закрываем шторки } delay(1000); // Задержка для обновления }

12. Интерактивный пандус

Описание: Используйте сервомотор для управления наклоном пандуса в зависимости от полученного сигнала от кнопки.

Схема подключения:

  • Кнопка к цифровому пину 2
  • Сервомотор к цифровому пину 9

Код:

cpp
#include <Servo.h> Servo myServo; const int buttonPin = 2; // Пин для кнопки int buttonState = 0; void setup() { myServo.attach(9); // Подключаем сервомотор pinMode(buttonPin, INPUT); // Настраиваем кнопку как вход } void loop() { buttonState = digitalRead(buttonPin); // Читаем состояние кнопки if (buttonState == HIGH) { myServo.write(90); // Поднимаем пандус delay(1000); // Ждем 1 секунду myServo.write(0); // Опускаем пандус } }

13. Сервоприводная дверь с дистанционным управлением

Описание: Используйте сервомотор для управления дверью, которую можно открыть и закрыть с помощью кнопок.

Схема подключения:

  • Кнопка "Открыть" к цифровому пину 2
  • Кнопка "Закрыть" к цифровому пину 3
  • Сервомотор к цифровому пину 9

Код:

cpp
#include <Servo.h> Servo myServo; const int openButtonPin = 2; // Пин для кнопки "Открыть" const int closeButtonPin = 3; // Пин для кнопки "Закрыть" void setup() { myServo.attach(9); // Подключаем сервомотор pinMode(openButtonPin, INPUT); // Настраиваем кнопку как вход pinMode(closeButtonPin, INPUT); // Настраиваем кнопку как вход } void loop() { if (digitalRead(openButtonPin) == HIGH) { myServo.write(90); // Открываем дверь } if (digitalRead(closeButtonPin) == HIGH) { myServo.write(0); // Закрываем дверь } }

14. Музыкальная шкатулка с сервоприводом

Описание: Используйте сервомотор для открывания шкатулки, когда нажимаете на кнопку, и воспроизводите мелодию.

Схема подключения:

  • Кнопка к цифровому пину 2
  • Сервомотор к цифровому пину 9
  • Динамик к аналоговому пину A0

Код:

cpp
#include <Servo.h> Servo myServo; const int buttonPin = 2; // Пин для кнопки void setup() { myServo.attach(9); // Подключаем сервомотор pinMode(buttonPin, INPUT); // Настраиваем кнопку как вход } void loop() { if (digitalRead(buttonPin) == HIGH) { myServo.write(90); // Открываем шкатулку delay(3000); // Открыто 3 секунды myServo.write(0); // Закрываем шкатулку playMelody(); // Воспроизводим мелодию } } void playMelody() { // Воспроизводим мелодию (пример с использованием функций для динамика) tone(A0, 440, 500); // Пример: нота A delay(500); noTone(A0); }

15. Автоматическая поливная система

Описание: Используйте сервомотор для управления клапаном воды в зависимости от уровня влажности почвы.

Схема подключения:

  • Датчик влажности к аналоговому пину A0
  • Сервомотор к цифровому пину 9

Код:

cpp
#include <Servo.h> Servo myServo; int soilMoisturePin = A0; // Пин для датчика влажности int moistureLevel; void setup() { myServo.attach(9); // Подключаем сервомотор } void loop() { moistureLevel = analogRead(soilMoisturePin); // Читаем уровень влажности if (moistureLevel < 500) { // Если почва сухая myServo.write(90); // Открываем клапан delay(5000); // Поливаем 5 секунд myServo.write(0); // Закрываем клапан } delay(10000); // Ждем 10 секунд перед следующим считыванием }

16. Сервомотор для регулировки температуры

Описание: Используйте сервомотор для управления заслонкой, которая открывается или закрывается в зависимости от температуры.

Схема подключения:

  • Датчик температуры к аналоговому пину A0
  • Сервомотор к цифровому пину 9

Код:

cpp
#include <Servo.h> Servo myServo; int tempSensorPin = A0; // Пин для датчика температуры int temperature; void setup() { myServo.attach(9); // Подключаем сервомотор } void loop() { temperature = analogRead(tempSensorPin); // Считываем температуру if (temperature > 512) { // Если температура высокая myServo.write(90); // Открываем заслонку } else { myServo.write(0); // Закрываем заслонку } delay(1000); // Задержка для обновления }

17. Гироскопическая игрушка

Описание: Используйте сервомотор для управления движением игрушки в зависимости от наклона, определяемого гироскопом.

Схема подключения:

  • Гироскоп к I2C (SDA и SCL)
  • Сервомотор к цифровому пину 9

Код:

cpp
#include <Wire.h> #include <MPU6050.h> MPU6050 mpu; Servo myServo; void setup() { Wire.begin(); mpu.initialize(); myServo.attach(9); // Подключаем сервомотор } void loop() { int16_t ax, ay, az; mpu.getAcceleration(&ax, &ay, &az); // Получаем данные с гироскопа if (ax > 5000) { myServo.write(90); // Игрушка движется вперед } else if (ax < -5000) { myServo.write(0); // Игрушка движется назад } delay(100); }

18. Пульт дистанционного управления

Описание: Используйте сервомотор для управления движением в зависимости от сигналов от инфракрасного пульта.

Схема подключения:

  • IR-приемник к цифровому пину 2
  • Сервомотор к цифровому пину 9

Код:

cpp
#include <IRremote.h> #include <Servo.h> IRrecv irrecv(2); decode_results results; Servo myServo; void setup() { irrecv.enableIRIn(); // Включаем приемник myServo.attach(9); // Подключаем сервомотор } void loop() { if (irrecv.decode(&results)) { if (results.value == YOUR_OPEN_CODE) { // Код для открытия myServo.write(90); } else if (results.value == YOUR_CLOSE_CODE) { // Код для закрытия myServo.write(0); } irrecv.resume(); // Ждем следующий код } }

19. Сигнализация двери

Описание: Используйте сервомотор для управления сигнализацией, когда дверь открыта или закрыта.

Схема подключения:

  • Датчик открытия двери к цифровому пину 2
  • Сервомотор к цифровому пину 9

Код:

cpp
#include <Servo.h> Servo myServo; const int doorSensorPin = 2; // Пин для датчика двери void setup() { myServo.attach(9); // Подключаем сервомотор pinMode(doorSensorPin, INPUT); // Настраиваем датчик как вход } void loop() { if (digitalRead(doorSensorPin) == HIGH) { // Дверь открыта myServo.write(90); // Сигнализация включена } else { myServo.write(0); // Сигнализация выключена } }

20. Игрушечный робот с дистанционным управлением

Описание: Используйте сервомотор для управления движением игрушечного робота.

Схема подключения:

  • Кнопка "Вперед" к цифровому пину 2
  • Кнопка "Назад" к цифровому пину 3
  • Сервомотор к цифровому пину 9

Код:

cpp
#include <Servo.h> Servo myServo; const int forwardButtonPin = 2; // Пин для кнопки "Вперед" const int backwardButtonPin = 3; // Пин для кнопки "Назад" void setup() { myServo.attach(9); // Подключаем сервомотор pinMode(forwardButtonPin, INPUT); // Настраиваем кнопки как входы pinMode(backwardButtonPin, INPUT); } void loop() { if (digitalRead(forwardButtonPin) == HIGH) { myServo.write(90); // Движение вперед } else if (digitalRead(backwardButtonPin) == HIGH) { myServo.write(0); // Движение назад } }

21. Контроль за животными

Описание: Используйте сервомотор для подачи корма животному при нажатии на кнопку.

Схема подключения:

  • Кнопка к цифровому пину 2
  • Сервомотор к цифровому пину 9

Код:

cpp
#include <Servo.h> Servo myServo; const int buttonPin = 2; // Пин для кнопки void setup() { myServo.attach(9); // Подключаем сервомотор pinMode(buttonPin, INPUT); // Настраиваем кнопку как вход } void loop() { if (digitalRead(buttonPin) == HIGH) { myServo.write(90); // Подаем корм delay(1000); // Держим открытым 1 секунду myServo.write(0); // Закрываем } }

22. Декоративный фонтан

Описание: Используйте сервомотор для управления подачей воды в фонтан.

Схема подключения:

  • Датчик уровня воды к аналоговому пину A0
  • Сервомотор к цифровому пину 9

Код:

cpp
#include <Servo.h> Servo myServo; int waterLevelPin = A0; // Пин для датчика уровня воды void setup() { myServo.attach(9); // Подключаем сервомотор } void loop() { int waterLevel = analogRead(waterLevelPin); // Считываем уровень воды if (waterLevel < 500) { // Если уровень низкий myServo.write(90); // Включаем подачу воды } else { myServo.write(0); // Останавливаем подачу воды } delay(1000); }

23. Система автоматической вентиляции

Описание: Используйте сервомотор для управления вентиляцией в зависимости от температуры.

Схема подключения:

  • Датчик температуры к аналоговому пину A0
  • Сервомотор к цифровому пину 9

Код:

cpp
#include <Servo.h> Servo myServo; int tempSensorPin = A0; // Пин для датчика температуры void setup() { myServo.attach(9); // Подключаем сервомотор } void loop() { int temperature = analogRead(tempSensorPin); // Считываем температуру if (temperature > 512) { // Если температура высокая myServo.write(90); // Открываем вентиляцию } else { myServo.write(0); // Закрываем вентиляцию } delay(1000); }

24. Система оповещения о движении

Описание: Используйте сервомотор для активации сигнализации при обнаружении движения.

Схема подключения:

  • PIR-сенсор к цифровому пину 2
  • Сервомотор к цифровому пину 9

Код:

cpp
#include <Servo.h> Servo myServo; const int pirPin = 2; // Пин для PIR-сенсора void setup() { myServo.attach(9); // Подключаем сервомотор pinMode(pirPin, INPUT); // Настраиваем PIR-сенсор как вход } void loop() { if (digitalRead(pirPin) == HIGH) { // Если движение обнаружено myServo.write(90); // Активируем сигнализацию delay(5000); // Держим 5 секунд myServo.write(0); // Отключаем сигнализацию } }

25. Умный цветок

Описание: Используйте сервомотор для автоматического полива цветка в зависимости от уровня влажности почвы.

Схема подключения:

  • Датчик влажности почвы к аналоговому пину A0
  • Сервомотор к цифровому пину 9

Код:

cpp
#include <Servo.h> Servo myServo; int soilMoisturePin = A0; // Пин для датчика влажности void setup() { myServo.attach(9); // Подключаем сервомотор } void loop() { int moistureLevel = analogRead(soilMoisturePin); // Считываем уровень влажности if (moistureLevel < 500) { // Если почва сухая myServo.write(90); // Полив delay(3000); // Поливаем 3 секунды myServo.write(0); // Закрываем подачу } delay(60000); // Ждем минуту перед следующим считыванием }

26. Автоматическая система освещения

Описание: Используйте сервомотор для открытия/закрытия штор в зависимости от освещения.

Схема подключения:

  • Датчик света к аналоговому пину A0
  • Сервомотор к цифровому пину 9

Код:

cpp
#include <Servo.h> Servo myServo; int lightSensorPin = A0; // Пин для датчика света void setup() { myServo.attach(9); // Подключаем сервомотор } void loop() { int lightValue = analogRead(lightSensorPin); // Считываем уровень освещения if (lightValue < 512) { // Если темно myServo.write(90); // Открываем шторы } else { myServo.write(0); // Закрываем шторы } delay(1000); }

27. Умная кормушка для животных

Описание: Используйте сервомотор для автоматической подачи корма в определенное время.

Схема подключения:

  • Сервомотор к цифровому пину 9

Код:

cpp
#include <Servo.h> #include <TimeLib.h> Servo myServo; void setup() { myServo.attach(9); // Подключаем сервомотор } void loop() { if (hour() == 8 && minute() == 0) { // Подаем корм в 8:00 myServo.write(90); // Открываем кормушку delay(5000); // Держим открытой 5 секунд myServo.write(0); // Закрываем } delay(60000); // Проверяем каждую минуту }

28. Ручной охранник

Описание: Используйте сервомотор для активации сигнализации при нажатии на кнопку.

Схема подключения:

  • Кнопка к цифровому пину 2
  • Сервомотор к цифровому пину 9

Код:

cpp
#include <Servo.h> Servo myServo; const int buttonPin = 2; // Пин для кнопки void setup() { myServo.attach(9); // Подключаем сервомотор pinMode(buttonPin, INPUT); // Настраиваем кнопку как вход } void loop() { if (digitalRead(buttonPin) == HIGH) { myServo.write(90); // Активируем сигнализацию delay(5000); // Держим 5 секунд myServo.write(0); // Деактивируем } }

29. Интерактивный стенд

Описание: Используйте сервомотор для управления моделью, реагирующей на взаимодействие.

Схема подключения:

  • Кнопка к цифровому пину 2
  • Сервомотор к цифровому пину 9

Код:

cpp
#include <Servo.h> Servo myServo; const int buttonPin = 2; // Пин для кнопки void setup() { myServo.attach(9); // Подключаем сервомотор pinMode(buttonPin, INPUT); // Настраиваем кнопку как вход } void loop() { if (digitalRead(buttonPin) == HIGH) { myServo.write(90); // Модель реагирует на нажатие delay(2000); // Держим 2 секунды myServo.write(0); // Возвращаем в исходное положение } }

30. Умный механический замок

Описание: Используйте сервомотор для управления замком, который открывается по сигналу.

Схема подключения:

  • Кнопка для открытия замка к цифровому пину 2
  • Сервомотор к цифровому пину 9

Код:

cpp
#include <Servo.h> Servo myServo; const int buttonPin = 2; // Пин для кнопки void setup() { myServo.attach(9); // Подключаем сервомотор pinMode(buttonPin, INPUT); // Настраиваем кнопку как вход } void loop() { if (digitalRead(buttonPin) == HIGH) { myServo.write(90); // Открываем замок delay(5000); // Держим открытым 5 секунд myServo.write(0); // Закрываем } }

1. Основные цифровые часы с отображением времени и даты на дисплее

Описание: Часы показывают текущее время и дату на LCD-дисплее.

Схема подключения:

  • RTC модуль подключен к I2C
  • LCD-дисплей к цифровым пинам

Код:

cpp
#include <Wire.h> #include <RTClib.h> #include <LiquidCrystal.h> RTC_DS3231 rtc; LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // Пины для LCD-дисплея void setup() { lcd.begin(16, 2); rtc.begin(); } void loop() { DateTime now = rtc.now(); lcd.setCursor(0, 0); lcd.print(now.hour(), DEC); lcd.print(":"); lcd.print(now.minute(), DEC); lcd.setCursor(0, 1); lcd.print(now.day(), DEC); lcd.print("/"); lcd.print(now.month(), DEC); lcd.print("/"); lcd.print(now.year(), DEC); delay(1000); }

2. Напоминание о времени приема лекарства

Описание: Устройство напоминает о времени приема лекарства путем звукового сигнала в определенное время.

Схема подключения:

  • RTC модуль к I2C
  • Пьезозуммер к цифровому пину 8

Код:

cpp
#include <Wire.h> #include <RTClib.h> RTC_DS3231 rtc; const int buzzerPin = 8; void setup() { rtc.begin(); pinMode(buzzerPin, OUTPUT); } void loop() { DateTime now = rtc.now(); if (now.hour() == 8 && now.minute() == 0) { // Напоминание в 8:00 tone(buzzerPin, 1000); // Включаем звуковой сигнал delay(5000); // 5 секунд noTone(buzzerPin); // Отключаем сигнал } delay(60000); }

3. Автоматическое включение света по времени

Описание: Автоматическое включение света в заданное время, например, в 19:00, и отключение в 6:00.

Схема подключения:

  • RTC модуль к I2C
  • Реле для света к цифровому пину 7

Код:

cpp
#include <Wire.h> #include <RTClib.h> RTC_DS3231 rtc; const int relayPin = 7; void setup() { rtc.begin(); pinMode(relayPin, OUTPUT); } void loop() { DateTime now = rtc.now(); if (now.hour() >= 19 || now.hour() < 6) { // Включение света digitalWrite(relayPin, HIGH); } else { digitalWrite(relayPin, LOW); // Отключение света } delay(60000); }

4. Таймер для управления насосом

Описание: Управляет насосом, включающимся на 15 минут каждый час.

Схема подключения:

  • RTC модуль к I2C
  • Реле для насоса к цифровому пину 6

Код:

cpp
#include <Wire.h> #include <RTClib.h> RTC_DS3231 rtc; const int pumpRelay = 6; void setup() { rtc.begin(); pinMode(pumpRelay, OUTPUT); } void loop() { DateTime now = rtc.now(); if (now.minute() < 15) { // Включаем насос в течение первых 15 минут каждого часа digitalWrite(pumpRelay, HIGH); } else { digitalWrite(pumpRelay, LOW); } delay(60000); }

5. Секундомер на основе RTC

Описание: Секундомер запускается кнопкой и выводит время на LCD.

Схема подключения:

  • RTC модуль к I2C
  • Кнопка к цифровому пину 9
  • LCD-дисплей

Код:

cpp
#include <Wire.h> #include <RTClib.h> #include <LiquidCrystal.h> RTC_DS3231 rtc; LiquidCrystal lcd(12, 11, 5, 4, 3, 2); const int buttonPin = 9; bool running = false; unsigned long startTime; void setup() { lcd.begin(16, 2); rtc.begin(); pinMode(buttonPin, INPUT); } void loop() { if (digitalRead(buttonPin) == HIGH && !running) { running = true; startTime = millis(); } if (running) { unsigned long elapsed = millis() - startTime; int seconds = elapsed / 1000; lcd.setCursor(0, 0); lcd.print("Sec: "); lcd.print(seconds); } delay(200); }

6. Будильник

Описание: Простейший будильник, который активирует звуковой сигнал в установленное время.

Схема подключения:

  • RTC модуль к I2C
  • Зуммер к цифровому пину 8

Код:

cpp
#include <Wire.h> #include <RTClib.h> RTC_DS3231 rtc; const int buzzerPin = 8; void setup() { rtc.begin(); pinMode(buzzerPin, OUTPUT); } void loop() { DateTime now = rtc.now(); if (now.hour() == 6 && now.minute() == 30) { // Будильник на 6:30 tone(buzzerPin, 1000); // Включаем звуковой сигнал delay(10000); noTone(buzzerPin); } delay(60000); }

7. Таймер на 1 час для полива растений

Описание: Включает насос на 5 минут каждые 55 минут.

Схема подключения:

  • RTC модуль к I2C
  • Реле для насоса к цифровому пину 6

Код:

cpp
#include <Wire.h> #include <RTClib.h> RTC_DS3231 rtc; const int pumpRelay = 6; void setup() { rtc.begin(); pinMode(pumpRelay, OUTPUT); } void loop() { DateTime now = rtc.now(); if (now.minute() < 5) { // Включаем насос на первые 5 минут каждого часа digitalWrite(pumpRelay, HIGH); } else { digitalWrite(pumpRelay, LOW); } delay(60000); }

8. Отображение температуры и времени на LCD

Описание: Отображает на LCD текущее время и температуру с модуля DS3231.

Схема подключения:

  • RTC модуль к I2C
  • LCD-дисплей

Код:

cpp
#include <Wire.h> #include <RTClib.h> #include <LiquidCrystal.h> RTC_DS3231 rtc; LiquidCrystal lcd(12, 11, 5, 4, 3, 2); void setup() { lcd.begin(16, 2); rtc.begin(); } void loop() { DateTime now = rtc.now(); float temperature = rtc.getTemperature(); lcd.setCursor(0, 0); lcd.print("Time: "); lcd.print(now.hour()); lcd.print(":"); lcd.print(now.minute()); lcd.setCursor(0, 1); lcd.print("Temp: "); lcd.print(temperature); lcd.print(" C"); delay(1000); }

9. Часы с автоматической регулировкой яркости дисплея

Описание: Вечером дисплей затемняется, а днем становится ярче.

Схема подключения:

  • RTC модуль к I2C
  • LCD-дисплей с регулируемой яркостью

Код:

cpp
#include <Wire.h> #include <RTClib.h> #include <LiquidCrystal.h> RTC_DS3231 rtc; LiquidCrystal lcd(12, 11, 5, 4, 3, 2); const int backlightPin = 6; void setup() { lcd.begin(16, 2); rtc.begin(); pinMode(backlightPin, OUTPUT); } void loop() { DateTime now = rtc.now(); if (now.hour() >= 20 || now.hour() < 6) { analogWrite(backlightPin, 50); // Ночная яркость } else { analogWrite(backlightPin, 255); // Дневная яркость } delay(60000); }

10. Таймер для активации вентиляции

Описание: Включает вентилятор на 10 минут каждый час.

Схема подключения:

  • RTC модуль к I2C
  • Реле для вентилятора к цифровому пину 7

Код:

cpp
#include <Wire.h> #include <RTClib.h> RTC_DS3231 rtc; const int fanRelay = 7; void setup() { rtc.begin(); pinMode(fanRelay, OUTPUT); } void loop() { DateTime now = rtc.now(); if (now.minute() < 10) { digitalWrite(fanRelay, HIGH); // Включаем вентилятор на 10 минут } else { digitalWrite(fanRelay, LOW); } delay(60000); }

1. Датчик температуры и влажности с дисплеем

Описание: Датчик DHT11 измеряет температуру и влажность, выводит данные на OLED дисплей.

cpp
#include <Wire.h> #include <Adafruit_SSD1306.h> #include <DHT.h> #define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 64 #define DHTPIN 2 #define DHTTYPE DHT11 Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1); DHT dht(DHTPIN, DHTTYPE); void setup() { display.begin(SSD1306_SWITCHCAPVCC, 0x3C); dht.begin(); } void loop() { float humidity = dht.readHumidity(); float temperature = dht.readTemperature(); display.clearDisplay(); display.setTextSize(1); display.setCursor(0, 0); display.print("Temp: "); display.print(temperature); display.println(" C"); display.print("Humidity: "); display.print(humidity); display.println(" %"); display.display(); delay(2000); }

2. Секундомер с дисплеем и кнопкой

Описание: Секундомер с кнопкой на старт и остановку, показ времени на LCD.

cpp
#include <Wire.h> #include <LiquidCrystal.h> LiquidCrystal lcd(12, 11, 5, 4, 3, 2); const int buttonPin = 8; bool running = false; unsigned long startTime; void setup() { lcd.begin(16, 2); pinMode(buttonPin, INPUT_PULLUP); } void loop() { if (digitalRead(buttonPin) == LOW && !running) { running = true; startTime = millis(); } else if (digitalRead(buttonPin) == LOW && running) { running = false; } lcd.setCursor(0, 0); lcd.print("Time: "); lcd.print((millis() - startTime) / 1000); delay(100); }

3. Светодиод, меняющий цвет по уровню освещенности

Описание: Светодиод RGB изменяет цвет в зависимости от яркости освещения с помощью фоторезистора.

cpp
const int photoPin = A0; const int redPin = 9; const int greenPin = 10; const int bluePin = 11; void setup() { pinMode(redPin, OUTPUT); pinMode(greenPin, OUTPUT); pinMode(bluePin, OUTPUT); } void loop() { int lightLevel = analogRead(photoPin); int red = map(lightLevel, 0, 1023, 0, 255); int green = map(lightLevel, 0, 1023, 255, 0); int blue = map(lightLevel, 0, 1023, 128, 255); analogWrite(redPin, red); analogWrite(greenPin, green); analogWrite(bluePin, blue); delay(100); }

4. Система безопасности с PIR-сенсором и сиреной

Описание: Устройство с PIR-сенсором, включающее сирену при обнаружении движения.

cpp
const int pirPin = 2; const int buzzerPin = 9; void setup() { pinMode(pirPin, INPUT); pinMode(buzzerPin, OUTPUT); } void loop() { if (digitalRead(pirPin) == HIGH) { tone(buzzerPin, 1000); // Включаем сирену delay(1000); noTone(buzzerPin); // Выключаем сирену } delay(500); }

5. Управление светодиодами с телефона через Bluetooth

Описание: Управление цветами RGB-светодиодов через смартфон, подключенный по Bluetooth.

cpp
#include <SoftwareSerial.h> SoftwareSerial BTSerial(10, 11); // RX, TX const int redPin = 9; const int greenPin = 10; const int bluePin = 11; void setup() { BTSerial.begin(9600); pinMode(redPin, OUTPUT); pinMode(greenPin, OUTPUT); pinMode(bluePin, OUTPUT); } void loop() { if (BTSerial.available()) { char color = BTSerial.read(); if (color == 'R') { analogWrite(redPin, 255); analogWrite(greenPin, 0); analogWrite(bluePin, 0); } else if (color == 'G') { analogWrite(redPin, 0); analogWrite(greenPin, 255); analogWrite(bluePin, 0); } else if (color == 'B') { analogWrite(redPin, 0); analogWrite(greenPin, 0); analogWrite(bluePin, 255); } } }

1. Детектор движения с PIR-сенсором и светодиодом

Описание: Датчик движения (PIR) включает светодиод, если обнаружено движение.

cpp
const int pirPin = 2; // Пин для подключения PIR сенсора const int ledPin = 13; // Пин для подключения светодиода void setup() { pinMode(pirPin, INPUT); // PIR сенсор как вход pinMode(ledPin, OUTPUT); // Светодиод как выход } void loop() { int motionDetected = digitalRead(pirPin); // Чтение данных с PIR if (motionDetected == HIGH) { digitalWrite(ledPin, HIGH); // Включаем светодиод delay(1000); // Задержка для визуального эффекта } else { digitalWrite(ledPin, LOW); // Выключаем светодиод } }

2. Контроль уровня освещения с фоторезистором и RGB-светодиодом

Описание: Уровень освещения контролируется фоторезистором, светодиод меняет цвет в зависимости от светового потока.

cpp
const int photoPin = A0; // Пин для фоторезистора const int redPin = 9; // Пин для красного цвета RGB const int greenPin = 10; // Пин для зеленого цвета RGB const int bluePin = 11; // Пин для синего цвета RGB void setup() { pinMode(redPin, OUTPUT); pinMode(greenPin, OUTPUT); pinMode(bluePin, OUTPUT); } void loop() { int lightLevel = analogRead(photoPin); int red = map(lightLevel, 0, 1023, 255, 0); // Чем ярче свет, тем меньше красного int green = map(lightLevel, 0, 1023, 0, 255); // Чем ярче свет, тем больше зеленого int blue = map(lightLevel, 0, 1023, 0, 128); // Синий для уравновешивания analogWrite(redPin, red); analogWrite(greenPin, green); analogWrite(bluePin, blue); delay(100); }

3. Звуковая сигнализация при уровне шума с микрофонным модулем

Описание: Микрофон реагирует на громкий звук, зажигая светодиод.

cpp
const int micPin = A0; // Пин для микрофона const int ledPin = 13; // Пин для светодиода void setup() { pinMode(ledPin, OUTPUT); } void loop() { int soundLevel = analogRead(micPin); // Чтение уровня звука if (soundLevel > 512) { // Порог для срабатывания digitalWrite(ledPin, HIGH); // Включаем светодиод delay(500); digitalWrite(ledPin, LOW); // Выключаем светодиод } delay(100); }

4. Контроль температуры с DHT11 и реле

Описание: Если температура превышает порог, включается реле.

cpp
#include <DHT.h> #define DHTPIN 2 #define DHTTYPE DHT11 #define relayPin 8 DHT dht(DHTPIN, DHTTYPE); void setup() { dht.begin(); pinMode(relayPin, OUTPUT); } void loop() { float temp = dht.readTemperature(); if (temp > 25) { digitalWrite(relayPin, HIGH); // Включаем реле при температуре > 25°C } else { digitalWrite(relayPin, LOW); // Выключаем реле } delay(2000); }

5. Автоматический ночник на основе фоторезистора

Описание: Светодиод загорается при низком уровне освещения.

cpp
const int lightSensor = A0; const int ledPin = 13; void setup() { pinMode(ledPin, OUTPUT); } void loop() { int lightLevel = analogRead(lightSensor); if (lightLevel < 300) { // Пороговая величина для срабатывания digitalWrite(ledPin, HIGH); // Включаем светодиод } else { digitalWrite(ledPin, LOW); // Выключаем светодиод } delay(100); }

6. Ультразвуковой измеритель расстояния с индикацией светодиодом

Описание: Светодиод мигает, если расстояние меньше 20 см.

cpp
const int trigPin = 9; const int echoPin = 10; const int ledPin = 13; void setup() { pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); pinMode(ledPin, OUTPUT); } void loop() { digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); long duration = pulseIn(echoPin, HIGH); int distance = duration * 0.034 / 2; if (distance < 20) { digitalWrite(ledPin, HIGH); // Включаем светодиод } else { digitalWrite(ledPin, LOW); // Выключаем светодиод } delay(100); }

7. Контроль влажности почвы для автоматического полива

Описание: При низкой влажности почвы включается насос (через реле).

cpp
const int soilSensorPin = A0; const int relayPin = 8; void setup() { pinMode(relayPin, OUTPUT); } void loop() { int soilMoisture = analogRead(soilSensorPin); if (soilMoisture < 400) { digitalWrite(relayPin, HIGH); // Включаем реле (подача воды) } else { digitalWrite(relayPin, LOW); // Выключаем реле } delay(1000); }

8. Индикация высокого уровня CO2 с помощью сирены

Описание: Если уровень CO2 превышает порог, включается сирена.

cpp
const int co2Pin = A0; const int buzzerPin = 8; void setup() { pinMode(buzzerPin, OUTPUT); } void loop() { int co2Level = analogRead(co2Pin); if (co2Level > 600) { // Пороговое значение tone(buzzerPin, 1000); // Включаем сирену } else { noTone(buzzerPin); // Выключаем сирену } delay(500); }

9. Мигающий светодиод в зависимости от уровня шума

Описание: Светодиод мигает быстрее при высоком уровне шума.

cpp
const int micPin = A0; const int ledPin = 13; void setup() { pinMode(ledPin, OUTPUT); } void loop() { int soundLevel = analogRead(micPin); int blinkDelay = map(soundLevel, 0, 1023, 500, 50); digitalWrite(ledPin, HIGH); delay(blinkDelay); digitalWrite(ledPin, LOW); delay(blinkDelay); }

10. Индикация уровня воды с помощью светодиода

Описание: Светодиод включается при низком уровне воды (симуляция датчика уровня воды).

cpp
const int waterLevelPin = A0; const int ledPin = 13; void setup() { pinMode(ledPin, OUTPUT); } void loop() { int waterLevel = analogRead(waterLevelPin); if (waterLevel < 300) { // Порог для срабатывания digitalWrite(ledPin, HIGH); // Включаем светодиод } else { digitalWrite(ledPin, LOW); // Выключаем светодиод } delay(100); }

11. Секундомер с кнопкой и дисплеем

Описание: Кнопка запускает/останавливает секундомер, а значение отображается на дисплее.

cpp
#include <LiquidCrystal.h> const int buttonPin = 2; const int lcdRs = 7, lcdEn = 8, lcdD4 = 9, lcdD5 = 10, lcdD6 = 11, lcdD7 = 12; LiquidCrystal lcd(lcdRs, lcdEn, lcdD4, lcdD5, lcdD6, lcdD7); bool running = false; unsigned long startTime = 0; unsigned long elapsedTime = 0; void setup() { pinMode(buttonPin, INPUT_PULLUP); lcd.begin(16, 2); lcd.print("Time: 0 s"); } void loop() { if (digitalRead(buttonPin) == LOW) { delay(200); running = !running; if (running) { startTime = millis() - elapsedTime; } } if (running) { elapsedTime = millis() - startTime; lcd.setCursor(6, 0); lcd.print(elapsedTime / 1000); // Отображение секунд } }

12. Звуковая сигнализация при падении с акселерометром

Описание: Сирена включается, если датчик обнаруживает быстрое изменение положения.

cpp
#include <Wire.h> #include <Adafruit_MPU6050.h> Adafruit_MPU6050 mpu; const int buzzerPin = 9; void setup() { Serial.begin(115200); mpu.begin(); pinMode(buzzerPin, OUTPUT); } void loop() { sensors_event_t a, g, temp; mpu.getEvent(&a, &g, &temp); if (abs(a.acceleration.z) > 10) { // Порог чувствительности падения tone(buzzerPin, 1000); // Включаем сирену } else { noTone(buzzerPin); // Выключаем сирену } delay(100); }

13. Управление яркостью RGB LED с тремя потенциометрами

Описание: Каждый потенциометр управляет яркостью отдельного цвета в RGB светодиоде.

cpp
const int redPin = 9; const int greenPin = 10; const int bluePin = 11; const int potRed = A0; const int potGreen = A1; const int potBlue = A2; void setup() { pinMode(redPin, OUTPUT); pinMode(greenPin, OUTPUT); pinMode(bluePin, OUTPUT); } void loop() { int redValue = analogRead(potRed) / 4; int greenValue = analogRead(potGreen) / 4; int blueValue = analogRead(potBlue) / 4; analogWrite(redPin, redValue); analogWrite(greenPin, greenValue); analogWrite(bluePin, blueValue); delay(50); }

14. Световая сигнализация с ультразвуковым сенсором

Описание: Светодиод включается, если объект приближается ближе 10 см.

cpp
const int trigPin = 9; const int echoPin = 10; const int ledPin = 13; void setup() { pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); pinMode(ledPin, OUTPUT); } void loop() { digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); long duration = pulseIn(echoPin, HIGH); int distance = duration * 0.034 / 2; if (distance < 10) { digitalWrite(ledPin, HIGH); } else { digitalWrite(ledPin, LOW); } delay(100); }

15. Сервоприводный механизм для открытия двери

Описание: Сервопривод поворачивается на 90°, открывая дверь, при нажатии кнопки.

cpp
#include <Servo.h> Servo doorServo; const int buttonPin = 2; void setup() { doorServo.attach(9); pinMode(buttonPin, INPUT_PULLUP); } void loop() { if (digitalRead(buttonPin) == LOW) { doorServo.write(90); // Открытие двери delay(1000); doorServo.write(0); // Закрытие двери delay(1000); } }

16. Реакция на движение с PIR сенсором и светодиодами

Описание: Когда PIR-сенсор обнаруживает движение, включается светодиод.

cpp
const int pirPin = 2; const int ledPin = 13; void setup() { pinMode(pirPin, INPUT); pinMode(ledPin, OUTPUT); } void loop() { if (digitalRead(pirPin) == HIGH) { digitalWrite(ledPin, HIGH); delay(2000); // Свет горит 2 секунды digitalWrite(ledPin, LOW); } }

17. Умный замок с RFID и сервомотором

Описание: При успешном считывании метки RFID сервомотор открывает замок.

cpp
#include <SPI.h> #include <MFRC522.h> #include <Servo.h> #define SS_PIN 10 #define RST_PIN 9 MFRC522 mfrc522(SS_PIN, RST_PIN); Servo lockServo; void setup() { SPI.begin(); mfrc522.PCD_Init(); lockServo.attach(8); lockServo.write(0); // Замок закрыт } void loop() { if (!mfrc522.PICC_IsNewCardPresent() || !mfrc522.PICC_ReadCardSerial()) { return; } lockServo.write(90); // Открытие замка delay(3000); lockServo.write(0); // Закрытие замка }

18. Анализ окружающей среды с сенсором температуры и LED

Описание: Светодиод включается, если температура ниже заданного порога.

cpp
#include <DHT.h> #define DHTPIN 2 #define DHTTYPE DHT11 DHT dht(DHTPIN, DHTTYPE); const int ledPin = 13; void setup() { dht.begin(); pinMode(ledPin, OUTPUT); } void loop() { float temp = dht.readTemperature(); if (temp < 18) { digitalWrite(ledPin, HIGH); // Низкая температура } else { digitalWrite(ledPin, LOW); } delay(1000); }

19. Контроль температуры с терморезистором и вентилятором

Описание: Вентилятор включается, если температура поднимается выше 25°C.

cpp
const int tempPin = A0; const int fanPin = 9; void setup() { pinMode(fanPin, OUTPUT); } void loop() { int tempReading = analogRead(tempPin); float tempC = (tempReading / 1024.0) * 5.0 * 100.0; if (tempC > 25) { digitalWrite(fanPin, HIGH); // Включение вентилятора } else { digitalWrite(fanPin, LOW); // Выключение вентилятора } delay(500); }

20. Сигнализация уровня воды с сенсором и пьезоизлучателем

Описание: Пьезоизлучатель включается, если уровень воды становится низким.

cpp
const int waterLevelPin = A0; const int buzzerPin = 8; void setup() { pinMode(buzzerPin, OUTPUT); } void loop() { int waterLevel = analogRead(waterLevelPin); if (waterLevel < 300) { // Порог tone(buzzerPin, 1000); // Включение звука } else { noTone(buzzerPin); // Выключение звука } delay(1000); }

21. Мини-робот с сервомоторами и ультразвуковым датчиком

Описание: Робот движется вперед, пока не обнаружит препятствие с помощью ультразвукового датчика, после чего поворачивает.

cpp
#include <Servo.h> Servo leftMotor; Servo rightMotor; const int trigPin = 9; const int echoPin = 10; void setup() { leftMotor.attach(5); // Левый мотор rightMotor.attach(6); // Правый мотор pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); } void loop() { long duration, distance; digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); distance = (duration * 0.034) / 2; if (distance < 15) { // Если есть препятствие на расстоянии менее 15 см leftMotor.write(180); // Поворот влево rightMotor.write(0); delay(500); } else { leftMotor.write(0); // Движение вперед rightMotor.write(0); } delay(100); }

22. Умный дом: управление освещением и температурой

Описание: Управление освещением и вентилятором в зависимости от уровня освещенности и температуры.

cpp
#include <DHT.h> #define DHTPIN 2 #define DHTTYPE DHT11 DHT dht(DHTPIN, DHTTYPE); const int lightSensorPin = A0; const int ledPin = 9; // Светодиод const int fanPin = 10; // Вентилятор void setup() { dht.begin(); pinMode(ledPin, OUTPUT); pinMode(fanPin, OUTPUT); } void loop() { int lightLevel = analogRead(lightSensorPin); float temp = dht.readTemperature(); if (lightLevel < 300) { // Низкий уровень света digitalWrite(ledPin, HIGH); // Включаем свет } else { digitalWrite(ledPin, LOW); // Выключаем свет } if (temp > 25) { // Высокая температура digitalWrite(fanPin, HIGH); // Включаем вентилятор } else { digitalWrite(fanPin, LOW); // Выключаем вентилятор } delay(1000); }

23. Автономный полив растений с датчиком влажности

Описание: Полив растений при низком уровне влажности.

cpp
const int moistureSensorPin = A0; // Датчик влажности const int pumpPin = 9; // Помпа void setup() { pinMode(pumpPin, OUTPUT); } void loop() { int moistureLevel = analogRead(moistureSensorPin); if (moistureLevel < 300) { // Если влажность ниже порога digitalWrite(pumpPin, HIGH); // Включаем помпу delay(5000); // Поливаем 5 секунд digitalWrite(pumpPin, LOW); // Выключаем помпу } delay(10000); // Проверка каждые 10 секунд }

24. Автоматический дозатор с сервомотором

Описание: Дозатор управляет количеством жидкости, открывая клапан на 1 секунду при нажатии кнопки.

cpp
#include <Servo.h> Servo valveServo; const int buttonPin = 2; void setup() { valveServo.attach(9); pinMode(buttonPin, INPUT_PULLUP); } void loop() { if (digitalRead(buttonPin) == LOW) { // Если кнопка нажата valveServo.write(90); // Открываем клапан delay(1000); // Дозируем 1 секунду valveServo.write(0); // Закрываем клапан delay(1000); // Ждем перед следующей дозировкой } }

25. Система анти-кражи с несколькими сенсорами

Описание: Если PIR или магнитный датчик срабатывает, включается сигнализация.

cpp
const int pirPin = 2; const int magneticPin = 3; const int buzzerPin = 9; void setup() { pinMode(pirPin, INPUT); pinMode(magneticPin, INPUT); pinMode(buzzerPin, OUTPUT); } void loop() { if (digitalRead(pirPin) == HIGH || digitalRead(magneticPin) == LOW) { tone(buzzerPin, 1000); // Включаем сигнализацию delay(1000); } else { noTone(buzzerPin); // Выключаем сигнализацию } }

26. Контроль влажности воздуха в помещении

Описание: Вентилятор включается, если влажность воздуха превышает 70%.

cpp
#include <DHT.h> #define DHTPIN 2 #define DHTTYPE DHT11 DHT dht(DHTPIN, DHTTYPE); const int fanPin = 9; void setup() { dht.begin(); pinMode(fanPin, OUTPUT); } void loop() { float humidity = dht.readHumidity(); if (humidity > 70) { // Высокая влажность digitalWrite(fanPin, HIGH); // Включаем вентилятор } else { digitalWrite(fanPin, LOW); // Выключаем вентилятор } delay(1000); }

27. Автоматическое освещение при заходе солнца

Описание: Включение светодиода при низком уровне освещенности.

cpp
const int lightSensorPin = A0; const int ledPin = 9; void setup() { pinMode(ledPin, OUTPUT); } void loop() { int lightLevel = analogRead(lightSensorPin); if (lightLevel < 300) { // Низкий уровень света digitalWrite(ledPin, HIGH); // Включаем свет } else { digitalWrite(ledPin, LOW); // Выключаем свет } delay(1000); }

28. Система паркинга с ультразвуковыми датчиками

Описание: Система включает светодиод, если расстояние до препятствия менее 20 см.

cpp
const int trigPin = 9; const int echoPin = 10; const int ledPin = 13; void setup() { pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); pinMode(ledPin, OUTPUT); } void loop() { digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); long duration = pulseIn(echoPin, HIGH); int distance = duration * 0.034 / 2; if (distance < 20) { // Если расстояние меньше 20 см digitalWrite(ledPin, HIGH); // Включаем индикатор } else { digitalWrite(ledPin, LOW); // Выключаем индикатор } delay(100); }

29. Реакция на шум с записью на дисплей

Описание: Уровень звука отображается на LCD-дисплее.

cpp
#include <LiquidCrystal.h> LiquidCrystal lcd(7, 8, 9, 10, 11, 12); const int micPin = A0; void setup() { lcd.begin(16, 2); } void loop() { int soundLevel = analogRead(micPin); lcd.setCursor(0, 0); lcd.print("Sound Level:"); lcd.setCursor(0, 1); lcd.print(soundLevel); delay(500); }

30. Метеостанция с дисплеем для отображения данных

Описание: Метеостанция, показывающая температуру и влажность на дисплее.

cpp
#include <DHT.h> #include <LiquidCrystal.h> #define DHTPIN 2 #define DHTTYPE DHT11 DHT dht(DHTPIN, DHTTYPE); LiquidCrystal lcd(7, 8, 9, 10, 11, 12); void setup() { dht.begin(); lcd.begin(16, 2); } void loop() { float humidity = dht.readHumidity(); float temperature = dht.readTemperature(); lcd.setCursor(0, 0); lcd.print("Temp: "); lcd.print(temperature); lcd.print(" C"); lcd.setCursor(0, 1); lcd.print("Hum: "); lcd.print(humidity); lcd.print(" %"); delay(2000); }

31. Робот с управлением на основе звуковых команд

Описание: Робот реагирует на звуковые команды, используя микрофон и сервомоторы для движения.

cpp
#include <Servo.h> Servo leftMotor; Servo rightMotor; const int micPin = A0; void setup() { leftMotor.attach(5); rightMotor.attach(6); Serial.begin(9600); } void loop() { int soundLevel = analogRead(micPin); if (soundLevel > 600) { // Если звук превышает порог leftMotor.write(0); // Вперед rightMotor.write(0); } else { leftMotor.write(180); // Назад rightMotor.write(180); } delay(100); }

32. Система распознавания объектов с камерой и сервомотором

Описание: Система обнаруживает объекты и поворачивает сервомотор для их отслеживания.

cpp
#include <Servo.h> #include <Wire.h> #include <Adafruit_Sensor.h> #include <Adafruit_VCNL4010.h> Servo trackingServo; Adafruit_VCNL4010 vcnl; void setup() { trackingServo.attach(9); Serial.begin(9600); if (!vcnl.begin()) { Serial.println("VCNL4010 not found"); while (1); } } void loop() { uint16_t proximity = vcnl.readProximity(); if (proximity > 300) { // Если объект близко trackingServo.write(90); // Поворачиваем на 90 градусов } else { trackingServo.write(0); // Возвращаем в начальное положение } delay(500); }

33. Сигнализация утечки газа и оповещение

Описание: Сигнализация с использованием газового датчика и светодиода.

cpp
const int gasSensorPin = A0; // Датчик газа const int ledPin = 9; // Светодиод const int buzzerPin = 10; // Зуммер void setup() { pinMode(ledPin, OUTPUT); pinMode(buzzerPin, OUTPUT); } void loop() { int gasLevel = analogRead(gasSensorPin); if (gasLevel > 300) { // Если уровень газа высок digitalWrite(ledPin, HIGH); // Включаем светодиод tone(buzzerPin, 1000); // Включаем зуммер } else { digitalWrite(ledPin, LOW); // Выключаем светодиод noTone(buzzerPin); // Выключаем зуммер } delay(1000); }

34. Робот для измерения параметров окружающей среды

Описание: Робот с датчиком температуры и влажности, который перемещается по комнате и отображает данные.

cpp
#include <DHT.h> #include <Servo.h> #define DHTPIN 2 #define DHTTYPE DHT11 DHT dht(DHTPIN, DHTTYPE); Servo leftMotor; Servo rightMotor; void setup() { dht.begin(); leftMotor.attach(5); rightMotor.attach(6); Serial.begin(9600); } void loop() { float temp = dht.readTemperature(); float humidity = dht.readHumidity(); Serial.print("Temperature: "); Serial.print(temp); Serial.print(" C, Humidity: "); Serial.print(humidity); Serial.println(" %"); // Движение вперед leftMotor.write(0); rightMotor.write(0); delay(1000); // Поворот leftMotor.write(180); rightMotor.write(0); delay(500); }

35. Модульный робот с управлением жестами

Описание: Робот, который управляется жестами с помощью акселерометра.

cpp
#include <Servo.h> #include <Wire.h> #include <Adafruit_MPU6050.h> Adafruit_MPU6050 mpu; Servo leftMotor; Servo rightMotor; void setup() { Serial.begin(115200); mpu.begin(); leftMotor.attach(5); rightMotor.attach(6); } void loop() { mpu.read(); if (mpu.getYAccel() > 1000) { // Движение вперед leftMotor.write(0); rightMotor.write(0); } else { leftMotor.write(180); // Назад rightMotor.write(180); } delay(100); }

36. Машинное обучение для распознавания звуков

Описание: Использует простую модель для распознавания звуковых команд и управления устройствами.

cpp
#include <ArduinoSound.h> const int micPin = A0; void setup() { Serial.begin(9600); } void loop() { int soundLevel = analogRead(micPin); Serial.print("Sound Level: "); Serial.println(soundLevel); // Логика распознавания звуковых команд будет добавлена здесь // Например: если soundLevel превышает порог, выполняем действие delay(500); }

37. Контроль движения с акселерометром и гироскопом

Описание: Датчик отслеживает движения и управляет сервомоторами в зависимости от направления.

cpp
#include <Wire.h> #include <Adafruit_MPU6050.h> #include <Servo.h> Adafruit_MPU6050 mpu; Servo motor; void setup() { Serial.begin(115200); mpu.begin(); motor.attach(9); } void loop() { mpu.read(); if (mpu.getYAccel() > 1000) { motor.write(0); // Движение вперед } else { motor.write(180); // Движение назад } delay(100); }

38. Система учета посетителей с RFID и дисплеем

Описание: Система учитывает входящих посетителей и отображает их количество на LCD-дисплее.

cpp
#include <LiquidCrystal.h> #include <SPI.h> #include <MFRC522.h> #define RST_PIN 9 // Резет #define SS_PIN 10 // Чтение MFRC522 rfid(SS_PIN, RST_PIN); // Создание экземпляра RFID LiquidCrystal lcd(7, 8, 9, 10, 11, 12); int visitorCount = 0; void setup() { Serial.begin(9600); lcd.begin(16, 2); SPI.begin(); rfid.PCD_Init(); lcd.print("Visitors: 0"); } void loop() { if (rfid.PICC_IsNewCardPresent() && rfid.PICC_ReadCardSerial()) { visitorCount++; lcd.clear(); lcd.print("Visitors: "); lcd.print(visitorCount); delay(1000); } }

39. Домашний питомец с интерактивным поведением

Описание: Интерактивная игрушка, которая реагирует на движения и звуки.

cpp
#include <Servo.h> Servo petServo; const int micPin = A0; void setup() { petServo.attach(9); Serial.begin(9600); } void loop() { int soundLevel = analogRead(micPin); if (soundLevel > 600) { // Если звук превышает порог petServo.write(90); // Поворачиваем игрушку } else { petServo.write(0); // Возвращаем в исходное положение } delay(100); }

40. Эко-станция для автоматизированного ухода за растениями

Описание: Система, которая поливает растения и контролирует их состояние.

cpp
#include <DHT.h> #include <Servo.h> #define DHTPIN 2 #define DHTTYPE DHT11 DHT dht(DHTPIN, DHTTYPE); Servo valveServo; const int moistureSensorPin = A0; void setup() { dht.begin(); valveServo.attach(9); pinMode(moistureSensorPin, INPUT); } void loop() { int moistureLevel = analogRead(moistureSensorPin); float humidity = dht.readHumidity(); if (moistureLevel < 300) { // Если влажность ниже порога valveServo.write(90); // Открываем клапан delay(5000); // Поливаем 5 секунд valveServo.write(0); // Закрываем клапан } delay(60000); // Проверяем каждые 60 секунд }

41. Автоматизированная кормушка для животных

Описание: Кормушка, которая автоматически подает корм в заданное время.

cpp
#include <Servo.h> #include <RTClib.h> Servo feederServo; RTC_DS1307 rtc; void setup() { feederServo.attach(9); Serial.begin(9600); rtc.begin(); rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // Установка времени компиляции } void loop() { DateTime now = rtc.now(); if (now.hour() == 8 && now.minute() == 0) { // Кормление в 8:00 feederServo.write(90); // Открываем кормушку delay(5000); // Кормим 5 секунд feederServo.write(0); // Закрываем кормушку delay(60000); // Ждем 1 минуту, чтобы избежать повторного кормления } delay(1000); }

42. Умный будильник с управлением через сервомотор

Описание: Будильник, который открывает заслонку, когда приходит время будильника.

cpp
#include <Servo.h> #include <RTClib.h> Servo alarmServo; RTC_DS1307 rtc; void setup() { alarmServo.attach(9); Serial.begin(9600); rtc.begin(); rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); } void loop() { DateTime now = rtc.now(); if (now.hour() == 7 && now.minute() == 0) { // Будильник на 7:00 alarmServo.write(90); // Открываем заслонку delay(5000); // Открыто 5 секунд alarmServo.write(0); // Закрываем delay(60000); // Ждем минуту } delay(1000); }

43. Контроль уровня воды с сервомотором для открытия/закрытия клапана

Описание: Система контроля уровня воды, которая открывает или закрывает клапан в зависимости от уровня воды.

cpp
#include <Servo.h> Servo valveServo; const int waterLevelPin = A0; // Датчик уровня воды void setup() { valveServo.attach(9); pinMode(waterLevelPin, INPUT); } void loop() { int waterLevel = analogRead(waterLevelPin); if (waterLevel < 300) { // Уровень воды низкий valveServo.write(90); // Открываем клапан } else { valveServo.write(0); // Закрываем клапан } delay(1000); }

44. Система автоматического полива с контролем влажности

Описание: Система, которая поливает растения, когда уровень влажности почвы ниже заданного значения.

cpp
#include <DHT.h> #include <Servo.h> #define DHTPIN 2 #define DHTTYPE DHT11 DHT dht(DHTPIN, DHTTYPE); Servo waterPumpServo; const int moistureSensorPin = A0; void setup() { dht.begin(); waterPumpServo.attach(9); pinMode(moistureSensorPin, INPUT); } void loop() { int moistureLevel = analogRead(moistureSensorPin); if (moistureLevel < 300) { // Если влажность низкая waterPumpServo.write(90); // Включаем насос delay(5000); // Полив 5 секунд waterPumpServo.write(0); // Отключаем насос } delay(60000); // Проверяем каждую минуту }

45. Сигнализация движения с сервомотором для поворота камеры

Описание: Система, которая поворачивает камеру при обнаружении движения.

cpp
#include <Servo.h> #include <Wire.h> #include <Adafruit_MPU6050.h> Adafruit_MPU6050 mpu; Servo cameraServo; void setup() { Serial.begin(115200); mpu.begin(); cameraServo.attach(9); } void loop() { mpu.read(); if (mpu.getYAccel() > 1000) { // Если движение обнаружено cameraServo.write(90); // Поворачиваем камеру delay(1000); cameraServo.write(0); // Возвращаем обратно } delay(100); }

46. Дверной замок с RFID и сервомотором

Описание: Замок, который открывается при считывании RFID-метки.

cpp
#include <Servo.h> #include <SPI.h> #include <MFRC522.h> #define RST_PIN 9 // Резет #define SS_PIN 10 // Чтение MFRC522 rfid(SS_PIN, RST_PIN); // Создание экземпляра RFID Servo doorLockServo; void setup() { Serial.begin(9600); SPI.begin(); rfid.PCD_Init(); doorLockServo.attach(6); } void loop() { if (rfid.PICC_IsNewCardPresent() && rfid.PICC_ReadCardSerial()) { Serial.println("Door opened"); doorLockServo.write(90); // Открываем замок delay(5000); // Держим открытым 5 секунд doorLockServo.write(0); // Закрываем замок } }

47. Управление яркостью LED с помощью сервомотора и потенциометра

Описание: Управление яркостью LED, используя сервомотор и потенциометр.

cpp
#include <Servo.h> Servo brightnessServo; const int potPin = A0; // Потенциометр const int ledPin = 9; // Светодиод void setup() { brightnessServo.attach(6); pinMode(ledPin, OUTPUT); } void loop() { int potValue = analogRead(potPin); int brightness = map(potValue, 0, 1023, 0, 255); // Преобразование значений analogWrite(ledPin, brightness); // Установка яркости LED // Управление сервомотором if (brightness > 128) { brightnessServo.write(90); // Угол 90, если яркость выше 50% } else { brightnessServo.write(0); // Угол 0, если яркость ниже 50% } delay(100); }

48. Автоматическое открытие окна в зависимости от температуры

Описание: Окно открывается или закрывается в зависимости от температуры.

cpp
#include <DHT.h> #include <Servo.h> #define DHTPIN 2 #define DHTTYPE DHT11 DHT dht(DHTPIN, DHTTYPE); Servo windowServo; void setup() { dht.begin(); windowServo.attach(9); } void loop() { float temperature = dht.readTemperature(); if (temperature > 25) { // Если температура выше 25°C windowServo.write(90); // Открываем окно } else { windowServo.write(0); // Закрываем окно } delay(1000); }

49. Интерактивный термометр с сервомотором

Описание: Интерактивный термометр, который показывает температуру с помощью сервомотора.

cpp
#include <DHT.h> #include <Servo.h> #define DHTPIN 2 #define DHTTYPE DHT11 DHT dht(DHTPIN, DHTTYPE); Servo pointerServo; void setup() { dht.begin(); pointerServo.attach(9); } void loop() { float temperature = dht.readTemperature(); int servoPos = map(temperature, 0, 50, 0, 180); // Преобразование температуры в угол pointerServo.write(servoPos); // Установка угла delay(1000); }

50. Система контроля температуры и влажности с управлением вентилятором

Описание: Управляет вентилятором на основе температуры и влажности.

cpp
#include <DHT.h> #include <Servo.h> #define DHTPIN 2 #define DHTTYPE DHT11 DHT dht(DHTPIN, DHTTYPE); Servo fanServo; void setup() { dht.begin(); fanServo.attach(9); } void loop() { float temperature = dht.readTemperature(); float humidity = dht.readHumidity(); if (temperature > 30) { // Если температура выше 30°C fanServo.write(90); // Включаем вентилятор } else { fanServo.write(0); // Отключаем вентилятор } delay(1000); }

51. Сигнализация при обнаружении газа

Описание: Система, которая срабатывает при обнаружении газа и включает светодиоды и зуммер.

cpp
#include <Servo.h> const int gasSensorPin = A0; // Датчик газа const int ledPin = 9; // Светодиод const int buzzerPin = 10; // Зуммер void setup() { pinMode(ledPin, OUTPUT); pinMode(buzzerPin, OUTPUT); } void loop() { int gasLevel = analogRead(gasSensorPin); if (gasLevel > 300) { // Если уровень газа высок digitalWrite(ledPin, HIGH); // Включаем светодиод digitalWrite(buzzerPin, HIGH); // Включаем зуммер } else { digitalWrite(ledPin, LOW); // Выключаем светодиод digitalWrite(buzzerPin, LOW); // Выключаем зуммер } delay(1000); }

52. Автоматизированная система полива с учетом погоды

Описание: Система, которая не поливает растения, если ожидается дождь.

cpp
#include <DHT.h> #include <Servo.h> #include <Wire.h> #include <RTClib.h> #define DHTPIN 2 #define DHTTYPE DHT11 DHT dht(DHTPIN, DHTTYPE); Servo waterPumpServo; RTC_DS1307 rtc; void setup() { dht.begin(); waterPumpServo.attach(9); rtc.begin(); } void loop() { DateTime now = rtc.now(); float humidity = dht.readHumidity(); if (now.hour() == 8 && now.minute() == 0 && humidity < 50) { // Полив в 8:00, если влажность низкая waterPumpServo.write(90); // Включаем насос delay(5000); // Поливаем 5 секунд waterPumpServo.write(0); // Отключаем насос } delay(60000); // Проверяем каждую минуту }

53. Система открывания шторы по свету

Описание: Шторы автоматически открываются, когда уровень света высок.

cpp
#include <Servo.h> Servo curtainServo; const int lightSensorPin = A0; // Датчик света void setup() { curtainServo.attach(9); } void loop() { int lightLevel = analogRead(lightSensorPin); if (lightLevel > 700) { // Если уровень света высок curtainServo.write(90); // Открываем шторы } else { curtainServo.write(0); // Закрываем шторы } delay(1000); }

54. Система распознавания жестов для управления сервомотором

Описание: Система, которая управляет сервомотором в зависимости от жестов, распознаваемых акселерометром.

cpp
#include <Servo.h> #include <Wire.h> #include <Adafruit_MPU6050.h> Adafruit_MPU6050 mpu; Servo controlServo; void setup() { Serial.begin(115200); mpu.begin(); controlServo.attach(9); } void loop() { mpu.read(); if (mpu.getYAccel() > 500) { // Если обнаружено движение вверх controlServo.write(90); // Поворачиваем сервомотор } else if (mpu.getYAccel() < -500) { // Если движение вниз controlServo.write(0); // Возвращаем в исходное положение } delay(100); }

55. Механизм защиты от перегрева

Описание: Вентилятор включается при превышении заданной температуры.

cpp
#include <DHT.h> #include <Servo.h> #define DHTPIN 2 #define DHTTYPE DHT11 DHT dht(DHTPIN, DHTTYPE); Servo fanServo; void setup() { dht.begin(); fanServo.attach(9); } void loop() { float temperature = dht.readTemperature(); if (temperature > 30) { // Если температура выше 30°C fanServo.write(90); // Включаем вентилятор } else { fanServo.write(0); // Отключаем вентилятор } delay(1000); }

56. Система контроля температуры с управлением через мобильное приложение

Описание: Система, управляющая сервомотором на основе данных, отправленных через мобильное приложение.

cpp
#include <Servo.h> #include <DHT.h> #include <WiFi.h> #define DHTPIN 2 #define DHTTYPE DHT11 DHT dht(DHTPIN, DHTTYPE); Servo controlServo; void setup() { dht.begin(); controlServo.attach(9); WiFi.begin("SSID", "PASSWORD"); // Подключение к WiFi } void loop() { float temperature = dht.readTemperature(); // Код для получения данных из приложения (заглушка) int appControlValue = 90; // Например, получаем значение из приложения controlServo.write(appControlValue); // Устанавливаем положение сервомотора delay(1000); }

57. Интерактивная игрушка с сервомотором и сенсором касания

Описание: Игрушка реагирует на касание, двигая сервомотором.

cpp
#include <Servo.h> Servo toyServo; const int touchSensorPin = 2; // Датчик касания void setup() { toyServo.attach(9); pinMode(touchSensorPin, INPUT); } void loop() { if (digitalRead(touchSensorPin) == HIGH) { // Если касание toyServo.write(90); // Двигаем сервомотор delay(1000); toyServo.write(0); // Возвращаем в исходное положение } }

58. Автоматическая завеса с управлением по расписанию

Описание: Завеса открывается и закрывается по расписанию.

cpp
#include <Servo.h> #include <RTClib.h> Servo curtainServo; RTC_DS1307 rtc; void setup() { curtainServo.attach(9); rtc.begin(); } void loop() { DateTime now = rtc.now(); if (now.hour() == 7 && now.minute() == 0) { // Открываем завесу в 7:00 curtainServo.write(90); } if (now.hour() == 20 && now.minute() == 0) { // Закрываем в 20:00 curtainServo.write(0); } delay(60000); // Проверяем каждую минуту }

59. Сигнализация об отсутствии воды с управлением клапаном

Описание: Система закрывает клапан при отсутствии воды.

cpp
#include <Servo.h> Servo waterValveServo; const int waterLevelSensorPin = A0; // Датчик уровня воды void setup() { waterValveServo.attach(9); } void loop() { int waterLevel = analogRead(waterLevelSensorPin); if (waterLevel < 300) { // Если уровень воды низкий waterValveServo.write(90); // Закрываем клапан } else { waterValveServo.write(0); // Открываем клапан } delay(1000); }

60. Управление дорожным знаком с помощью сервомотора

Описание: Дорожный знак, который открывается или закрывается в зависимости от времени суток.

cpp
#include <Servo.h> #include <RTClib.h> Servo trafficSignServo; RTC_DS1307 rtc; void setup() { trafficSignServo.attach(9); rtc.begin(); } void loop() { DateTime now = rtc.now(); if (now.hour() >= 18 || now.hour() < 6) { // Ночной режим trafficSignServo.write(90); // Открываем знак } else { trafficSignServo.write(0); // Закрываем знак } delay(60000); // Проверяем каждую минуту }

61. Автоматическая кормушка для животных

Описание: Кормушка, которая автоматически подает корм в заданное время.

cpp
#include <Servo.h> #include <RTClib.h> Servo feederServo; RTC_DS1307 rtc; void setup() { feederServo.attach(9); rtc.begin(); } void loop() { DateTime now = rtc.now(); if (now.hour() == 8 && now.minute() == 0) { // Подавать корм в 8:00 feederServo.write(90); // Открываем кормушку delay(5000); // Открыто 5 секунд feederServo.write(0); // Закрываем кормушку } delay(60000); // Проверяем каждую минуту }

62. Интерактивный светильник

Описание: Светильник, который изменяет яркость в зависимости от уровня освещенности.

cpp
#include <Servo.h> Servo lightServo; const int lightSensorPin = A0; // Датчик света void setup() { lightServo.attach(9); } void loop() { int lightLevel = analogRead(lightSensorPin); // Изменяем угол сервомотора в зависимости от уровня света int servoPosition = map(lightLevel, 0, 1023, 0, 180); lightServo.write(servoPosition); delay(1000); }

63. Робот-пылесос с управлением по ИК-датчику

Описание: Робот-пылесос, который реагирует на препятствия и изменяет направление движения.

cpp
#include <Servo.h> Servo leftWheel; Servo rightWheel; const int irSensorPin = 2; // ИК-датчик void setup() { leftWheel.attach(9); rightWheel.attach(10); pinMode(irSensorPin, INPUT); } void loop() { if (digitalRead(irSensorPin) == HIGH) { // Если обнаружено препятствие leftWheel.write(0); // Останавливаем левое колесо rightWheel.write(180); // Разворачиваем вправо delay(500); // Ждем 0.5 секунды } else { leftWheel.write(180); // Движение вперед rightWheel.write(0); } delay(100); }

64. Система контроля доступа с сервоприводом

Описание: Замок, который открывается с помощью кода, введенного через кнопочную панель.

cpp
#include <Servo.h> #include <Keypad.h> const byte rows = 4; // Количество рядов const byte cols = 4; // Количество колонок char keys[rows][cols] = { {'1','2','3','A'}, {'4','5','6','B'}, {'7','8','9','C'}, {'*','0','#','D'} }; byte rowPins[rows] = {2, 3, 4, 5}; // Подключение рядов byte colPins[cols] = {6, 7, 8, 9}; // Подключение колонок Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, rows, cols); Servo lockServo; const String correctCode = "123A"; // Правильный код String enteredCode = ""; void setup() { lockServo.attach(10); lockServo.write(0); // Закрываем замок } void loop() { char key = keypad.getKey(); if (key) { enteredCode += key; // Добавляем нажатую кнопку в код if (enteredCode.length() == 4) { // Если введено 4 символа if (enteredCode == correctCode) { // Если код правильный lockServo.write(90); // Открываем замок delay(5000); // Открыто 5 секунд lockServo.write(0); // Закрываем замок } enteredCode = ""; // Сбрасываем код } } }

65. Система слежения за движением

Описание: Система, которая следит за движущимися объектами и поворачивает камеру в их сторону.

cpp
#include <Servo.h> #include <Adafruit_MPU6050.h> Adafruit_MPU6050 mpu; Servo cameraServo; void setup() { Serial.begin(115200); mpu.begin(); cameraServo.attach(9); } void loop() { mpu.read(); // Угол поворота камеры в зависимости от движения int angle = map(mpu.getYAccel(), -16000, 16000, 0, 180); cameraServo.write(angle); delay(100); }

66. Автоматическая система безопасности для дома

Описание: Система, которая включает сигнализацию при обнаружении движения.

cpp
#include <Servo.h> #include <DHT.h> const int pirSensorPin = 2; // PIR-датчик const int buzzerPin = 9; // Зуммер Servo securityServo; void setup() { securityServo.attach(10); pinMode(pirSensorPin, INPUT); pinMode(buzzerPin, OUTPUT); } void loop() { if (digitalRead(pirSensorPin) == HIGH) { // Если обнаружено движение securityServo.write(90); // Сигнализация digitalWrite(buzzerPin, HIGH); // Включаем зуммер delay(5000); // Действует 5 секунд digitalWrite(buzzerPin, LOW); // Выключаем зуммер securityServo.write(0); // Останавливаем сигнализацию } delay(1000); }

67. Термостат с автоматическим управлением

Описание: Устройство, которое поддерживает заданную температуру, включая или отключая обогреватель.

cpp
#include <DHT.h> #include <Servo.h> #define DHTPIN 2 #define DHTTYPE DHT11 DHT dht(DHTPIN, DHTTYPE); Servo heaterServo; void setup() { dht.begin(); heaterServo.attach(9); } void loop() { float temperature = dht.readTemperature(); if (temperature < 22) { // Если температура ниже 22°C heaterServo.write(90); // Включаем обогреватель } else { heaterServo.write(0); // Выключаем обогреватель } delay(1000); }

68. Система автоматического освещения

Описание: Освещение включается при обнаружении движения.

cpp
#include <Servo.h> Servo lightServo; const int pirSensorPin = 2; // PIR-датчик void setup() { lightServo.attach(9); pinMode(pirSensorPin, INPUT); } void loop() { if (digitalRead(pirSensorPin) == HIGH) { // Если обнаружено движение lightServo.write(90); // Включаем освещение } else { lightServo.write(0); // Выключаем освещение } delay(1000); }

69. Аудио сигнализация с управления через серво

Описание: Аудиосигнализация, которая активируется при обнаружении определенных условий.

cpp
#include <Servo.h> #include <DHT.h> #define DHTPIN 2 #define DHTTYPE DHT11 DHT dht(DHTPIN, DHTTYPE); Servo alarmServo; void setup() { dht.begin(); alarmServo.attach(9); } void loop() { float temperature = dht.readTemperature(); if (temperature > 30) { // Если температура выше 30°C alarmServo.write(90); // Включаем сигнализацию delay(5000); // Действует 5 секунд alarmServo.write(0); // Отключаем сигнализацию } delay(1000); }

70. Система контроля температуры и влажности

Описание: Устройство, которое управляет вентилятором и обогревателем в зависимости от температуры и влажности.

cpp
#include <DHT.h> #include <Servo.h> #define DHTPIN 2 #define DHTTYPE DHT11 DHT dht(DHTPIN, DHTTYPE); Servo fanServo; Servo heaterServo; void setup() { dht.begin(); fanServo.attach(9); heaterServo.attach(10); } void loop() { float temperature = dht.readTemperature(); float humidity = dht.readHumidity(); if (temperature > 30) { // Если температура выше 30°C fanServo.write(90); // Включаем вентилятор } else { fanServo.write(0); // Выключаем вентилятор } if (humidity < 30) { // Если влажность ниже 30% heaterServo.write(90); // Включаем обогреватель } else { heaterServo.write(0); // Выключаем обогреватель } delay(1000); }

71. Система мониторинга почвы

Описание: Устройство, которое контролирует уровень влажности почвы и включает насос для полива.

cpp
#include <DHT.h> #include <Servo.h> #define DHTPIN 2 // Подключение DHT датчика #define DHTTYPE DHT11 // Тип датчика DHT dht(DHTPIN, DHTTYPE); Servo pumpServo; // Серво для насоса void setup() { dht.begin(); pumpServo.attach(9); // Подключаем насос } void loop() { int soilMoisture = analogRead(A0); // Чтение уровня влажности почвы if (soilMoisture < 400) { // Если влажность ниже порога pumpServo.write(90); // Включаем насос delay(5000); // Поливаем 5 секунд pumpServo.write(0); // Отключаем насос } delay(10000); // Ждем 10 секунд перед следующим измерением }

72. Управление освещением с помощью кнопки

Описание: Устройство, которое управляет яркостью света с помощью кнопки и сервопривода.

cpp
#include <Servo.h> Servo lightServo; const int buttonPin = 2; // Кнопка int buttonState = 0; void setup() { lightServo.attach(9); pinMode(buttonPin, INPUT); } void loop() { buttonState = digitalRead(buttonPin); if (buttonState == HIGH) { // Если кнопка нажата lightServo.write(90); // Увеличиваем яркость delay(1000); lightServo.write(0); // Возвращаем яркость } delay(100); }

73. Система управления жалюзи

Описание: Устройство, которое открывает и закрывает жалюзи в зависимости от уровня света.

cpp
#include <Servo.h> Servo blindsServo; const int lightSensorPin = A0; // Датчик света void setup() { blindsServo.attach(9); } void loop() { int lightLevel = analogRead(lightSensorPin); if (lightLevel < 300) { // Если свет низкий blindsServo.write(0); // Открываем жалюзи } else { blindsServo.write(90); // Закрываем жалюзи } delay(1000); }

74. Автоматическая система вентиляции

Описание: Устройство, которое включает вентилятор при высокой температуре.

cpp
#include <DHT.h> #include <Servo.h> #define DHTPIN 2 #define DHTTYPE DHT11 DHT dht(DHTPIN, DHTTYPE); Servo fanServo; void setup() { dht.begin(); fanServo.attach(9); } void loop() { float temperature = dht.readTemperature(); if (temperature > 25) { // Если температура выше 25°C fanServo.write(90); // Включаем вентилятор } else { fanServo.write(0); // Выключаем вентилятор } delay(1000); }

75. Аудио сигнализация при превышении температуры

Описание: Устройство, которое включает звуковую сигнализацию при превышении определенной температуры.

cpp
#include <DHT.h> #include <Servo.h> #define DHTPIN 2 #define DHTTYPE DHT11 DHT dht(DHTPIN, DHTTYPE); Servo alarmServo; void setup() { dht.begin(); alarmServo.attach(9); } void loop() { float temperature = dht.readTemperature(); if (temperature > 30) { // Если температура выше 30°C alarmServo.write(90); // Включаем сигнализацию delay(5000); // Сигнализация 5 секунд alarmServo.write(0); // Отключаем сигнализацию } delay(1000); }

76. Автоматическая система полива

Описание: Система, которая контролирует уровень влажности почвы и автоматически включает насос.

cpp
#include <Servo.h> Servo pumpServo; const int soilMoisturePin = A0; // Датчик влажности почвы void setup() { pumpServo.attach(9); } void loop() { int soilMoisture = analogRead(soilMoisturePin); if (soilMoisture < 300) { // Если почва сухая pumpServo.write(90); // Включаем насос delay(5000); // Поливаем 5 секунд pumpServo.write(0); // Отключаем насос } delay(10000); // Проверяем каждые 10 секунд }

77. Управление вентиляцией с датчиком CO2

Описание: Устройство, которое включает вентилятор при повышенном уровне CO2.

cpp
#include <Servo.h> Servo fanServo; const int co2SensorPin = A0; // Датчик CO2 void setup() { fanServo.attach(9); } void loop() { int co2Level = analogRead(co2SensorPin); if (co2Level > 800) { // Если уровень CO2 выше 800 ppm fanServo.write(90); // Включаем вентилятор } else { fanServo.write(0); // Выключаем вентилятор } delay(1000); }

78. Система автоматического контроля за температурой

Описание: Устройство, которое поддерживает заданную температуру, включая обогреватель или вентилятор.

cpp
#include <DHT.h> #include <Servo.h> #define DHTPIN 2 #define DHTTYPE DHT11 DHT dht(DHTPIN, DHTTYPE); Servo heaterServo; Servo fanServo; void setup() { dht.begin(); heaterServo.attach(9); fanServo.attach(10); } void loop() { float temperature = dht.readTemperature(); if (temperature < 20) { // Если температура ниже 20°C heaterServo.write(90); // Включаем обогреватель } else { heaterServo.write(0); // Выключаем обогреватель } if (temperature > 25) { // Если температура выше 25°C fanServo.write(90); // Включаем вентилятор } else { fanServo.write(0); // Выключаем вентилятор } delay(1000); }

79. Система сигнализации с датчиком движения

Описание: Устройство, которое включает сигнализацию при обнаружении движения.

cpp
#include <Servo.h> Servo alarmServo; const int pirSensorPin = 2; // PIR-датчик void setup() { alarmServo.attach(9); pinMode(pirSensorPin, INPUT); } void loop() { if (digitalRead(pirSensorPin) == HIGH) { // Если обнаружено движение alarmServo.write(90); // Включаем сигнализацию delay(5000); // Сигнализация 5 секунд alarmServo.write(0); // Отключаем сигнализацию } delay(1000); }

80. Автоматическое открытие двери с RFID

Описание: Замок, который открывается с помощью RFID-метки.

cpp
#include <Servo.h> #include <SPI.h> #include <MFRC522.h> #define SS_PIN 10 // Подключение к пину SS #define RST_PIN 9 // Подключение к пину RST MFRC522 mfrc522(SS_PIN, RST_PIN); Servo doorServo; void setup() { Serial.begin(9600); SPI.begin(); mfrc522.PCD_Init(); doorServo.attach(8); doorServo.write(0); // Дверь закрыта } void loop() { if (mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial()) { if (mfrc522.uid.uidByte[0] == 0xDE && mfrc522.uid.uidByte[1] == 0xAD) { // Проверка UID doorServo.write(90); // Открываем дверь delay(5000); // Открыто 5 секунд doorServo.write(0); // Закрываем дверь } mfrc522.PICC_HaltA(); // Остановить считывание карты } }

81. Автоматическая система контроля температуры в холодильнике

Описание: Устройство, которое включает сигнализацию при превышении температуры в холодильнике.

cpp
#include <DHT.h> #include <Servo.h> #define DHTPIN 2 #define DHTTYPE DHT11 DHT dht(DHTPIN, DHTTYPE); Servo alarmServo; void setup() { dht.begin(); alarmServo.attach(9); } void loop() { float temperature = dht.readTemperature(); if (temperature > 5) { // Если температура выше 5°C alarmServo.write(90); // Включаем сигнализацию delay(5000); // Сигнализация 5 секунд alarmServo.write(0); // Выключаем сигнализацию } delay(1000); }

82. Управление автоматическими воротами с помощью кнопки

Описание: Устройство, которое открывает и закрывает ворота по нажатию кнопки.

cpp
#include <Servo.h> Servo gateServo; const int buttonPin = 2; // Кнопка int buttonState = 0; void setup() { gateServo.attach(9); pinMode(buttonPin, INPUT); } void loop() { buttonState = digitalRead(buttonPin); if (buttonState == HIGH) { // Если кнопка нажата gateServo.write(90); // Открываем ворота delay(5000); // Держим открытыми 5 секунд gateServo.write(0); // Закрываем ворота } delay(100); }

83. Система защиты от воды с датчиком уровня

Описание: Устройство, которое включает насос, если уровень воды поднимается слишком высоко.

cpp
#include <Servo.h> Servo pumpServo; const int waterLevelPin = A0; // Датчик уровня воды void setup() { pumpServo.attach(9); } void loop() { int waterLevel = analogRead(waterLevelPin); if (waterLevel > 700) { // Если уровень воды высокий pumpServo.write(90); // Включаем насос delay(5000); // Работаем 5 секунд pumpServo.write(0); // Отключаем насос } delay(10000); // Проверяем каждые 10 секунд }

84. Система автоматического полива с влажностью и температурой

Описание: Устройство, которое контролирует влажность почвы и температуру, чтобы включать насос.

cpp
#include <DHT.h> #include <Servo.h> #define DHTPIN 2 #define DHTTYPE DHT11 DHT dht(DHTPIN, DHTTYPE); Servo pumpServo; void setup() { dht.begin(); pumpServo.attach(9); } void loop() { int soilMoisture = analogRead(A0); float temperature = dht.readTemperature(); if (soilMoisture < 300 && temperature > 20) { // Если почва сухая и температура выше 20°C pumpServo.write(90); // Включаем насос delay(5000); // Поливаем 5 секунд pumpServo.write(0); // Отключаем насос } delay(10000); // Проверяем каждые 10 секунд }

85. Управление автоматическим жалюзи с датчиком света

Описание: Устройство, которое открывает жалюзи при низком уровне света.

cpp
#include <Servo.h> Servo blindsServo; const int lightSensorPin = A0; // Датчик света void setup() { blindsServo.attach(9); } void loop() { int lightLevel = analogRead(lightSensorPin); if (lightLevel < 300) { // Если свет низкий blindsServo.write(0); // Открываем жалюзи } else { blindsServo.write(90); // Закрываем жалюзи } delay(1000); }

86. Сигнализация с датчиком дыма

Описание: Устройство, которое включает сигнализацию при обнаружении дыма.

cpp
#include <Servo.h> Servo alarmServo; const int smokeSensorPin = A0; // Датчик дыма void setup() { alarmServo.attach(9); } void loop() { int smokeLevel = analogRead(smokeSensorPin); if (smokeLevel > 400) { // Если уровень дыма высокий alarmServo.write(90); // Включаем сигнализацию delay(5000); // Сигнализация 5 секунд alarmServo.write(0); // Отключаем сигнализацию } delay(1000); }

87. Система автоматического закрытия двери

Описание: Устройство, которое закрывает дверь через заданное время после открытия.

cpp
#include <Servo.h> Servo doorServo; const int buttonPin = 2; // Кнопка int buttonState = 0; void setup() { doorServo.attach(9); pinMode(buttonPin, INPUT); } void loop() { buttonState = digitalRead(buttonPin); if (buttonState == HIGH) { // Если кнопка нажата doorServo.write(90); // Открываем дверь delay(5000); // Держим открытыми 5 секунд doorServo.write(0); // Закрываем дверь } delay(100); }

88. Управление поливом с помощью RFID

Описание: Устройство, которое активирует полив, когда считывается определенная RFID-метка.

cpp
#include <Servo.h> #include <SPI.h> #include <MFRC522.h> #define SS_PIN 10 // Подключение к пину SS #define RST_PIN 9 // Подключение к пину RST MFRC522 mfrc522(SS_PIN, RST_PIN); Servo pumpServo; void setup() { Serial.begin(9600); SPI.begin(); mfrc522.PCD_Init(); pumpServo.attach(8); } void loop() { if (mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial()) { if (mfrc522.uid.uidByte[0] == 0xDE && mfrc522.uid.uidByte[1] == 0xAD) { // Проверка UID pumpServo.write(90); // Включаем насос delay(5000); // Поливаем 5 секунд pumpServo.write(0); // Отключаем насос } mfrc522.PICC_HaltA(); // Остановить считывание карты } }

89. Система вентиляции в зависимости от влажности

Описание: Устройство, которое включает вентилятор при высокой влажности.

cpp
#include <DHT.h> #include <Servo.h> #define DHTPIN 2 #define DHTTYPE DHT11 DHT dht(DHTPIN, DHTTYPE); Servo fanServo; void setup() { dht.begin(); fanServo.attach(9); } void loop() { float humidity = dht.readHumidity(); if (humidity > 70) { // Если влажность выше 70% fanServo.write(90); // Включаем вентилятор } else { fanServo.write(0); // Выключаем вентилятор } delay(1000); }

90. Управление жалюзи с помощью мобильного приложения

Описание: Устройство, которое управляет жалюзи с помощью Bluetooth-соединения.

cpp
#include <Servo.h> #include <SoftwareSerial.h> Servo blindsServo; SoftwareSerial bluetooth(10, 11); // RX, TX void setup() { blindsServo.attach(9); bluetooth.begin(9600); } void loop() { if (bluetooth.available()) { char command = bluetooth.read(); if (command == 'o') { // Команда открыть blindsServo.write(0); // Открываем } else if (command == 'c') { // Команда закрыть blindsServo.write(90); // Закрываем } } }

91. Система контроля освещения в зависимости от времени

Описание: Устройство, которое включает и выключает свет в зависимости от времени суток.

cpp
#include <Wire.h> #include <RTClib.h> #include <Servo.h> RTC_DS1307 rtc; Servo lightServo; void setup() { rtc.begin(); lightServo.attach(9); // Настройка времени (в реальном проекте лучше не выставлять время в коде) // rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // Настройка времени на время компиляции } void loop() { DateTime now = rtc.now(); if (now.hour() >= 18 || now.hour() < 6) { // Включаем свет с 18:00 до 6:00 lightServo.write(0); // Включаем свет } else { lightServo.write(90); // Выключаем свет } delay(60000); // Проверяем каждую минуту }

92. Автоматический полив с использованием нескольких датчиков

Описание: Устройство, которое контролирует уровень влажности в нескольких участках.

cpp
#include <Servo.h> Servo pumpServo; const int soilMoisturePin1 = A0; // Датчик 1 const int soilMoisturePin2 = A1; // Датчик 2 void setup() { pumpServo.attach(9); } void loop() { int moisture1 = analogRead(soilMoisturePin1); int moisture2 = analogRead(soilMoisturePin2); if (moisture1 < 300 || moisture2 < 300) { // Если хотя бы один участок сухой pumpServo.write(90); // Включаем насос delay(5000); // Поливаем 5 секунд pumpServo.write(0); // Отключаем насос } delay(10000); // Проверяем каждые 10 секунд }

93. Система безопасности с датчиком движения и камерами

Описание: Устройство, которое включает запись, когда обнаружено движение.

cpp
#include <Servo.h> Servo cameraServo; const int motionSensorPin = 2; // Датчик движения void setup() { cameraServo.attach(9); pinMode(motionSensorPin, INPUT); } void loop() { int motionDetected = digitalRead(motionSensorPin); if (motionDetected == HIGH) { // Если обнаружено движение cameraServo.write(90); // Включаем запись delay(5000); // Записываем 5 секунд cameraServo.write(0); // Отключаем запись } delay(1000); }

94. Автоматизация отопления в зависимости от температуры

Описание: Устройство, которое включает обогреватель при низкой температуре.

cpp
#include <DHT.h> #include <Servo.h> #define DHTPIN 2 #define DHTTYPE DHT11 DHT dht(DHTPIN, DHTTYPE); Servo heaterServo; void setup() { dht.begin(); heaterServo.attach(9); } void loop() { float temperature = dht.readTemperature(); if (temperature < 18) { // Если температура ниже 18°C heaterServo.write(90); // Включаем обогреватель } else { heaterServo.write(0); // Выключаем обогреватель } delay(1000); }

95. Система контроля доступа с RFID и сервоприводом

Описание: Устройство, которое открывает дверь при считывании определенной метки.

cpp
#include <SPI.h> #include <MFRC522.h> #include <Servo.h> #define SS_PIN 10 // Подключение к пину SS #define RST_PIN 9 // Подключение к пину RST MFRC522 mfrc522(SS_PIN, RST_PIN); Servo doorServo; void setup() { Serial.begin(9600); SPI.begin(); mfrc522.PCD_Init(); doorServo.attach(8); } void loop() { if (mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial()) { if (mfrc522.uid.uidByte[0] == 0xDE && mfrc522.uid.uidByte[1] == 0xAD) { // Проверка UID doorServo.write(90); // Открываем дверь delay(5000); // Держим открытой 5 секунд doorServo.write(0); // Закрываем дверь } mfrc522.PICC_HaltA(); // Остановить считывание карты } }

96. Интерактивная игра с сервоприводом и кнопками

Описание: Устройство, которое реагирует на нажатие кнопок и управляет сервоприводом.

cpp
#include <Servo.h> Servo gameServo; const int buttonPin1 = 2; // Кнопка 1 const int buttonPin2 = 3; // Кнопка 2 void setup() { gameServo.attach(9); pinMode(buttonPin1, INPUT); pinMode(buttonPin2, INPUT); } void loop() { if (digitalRead(buttonPin1) == HIGH) { // Если нажата кнопка 1 gameServo.write(0); // Позиция 1 delay(1000); } if (digitalRead(buttonPin2) == HIGH) { // Если нажата кнопка 2 gameServo.write(90); // Позиция 2 delay(1000); } }

97. Умный замок с Bluetooth и сервоприводом

Описание: Устройство, которое открывает замок по Bluetooth-команде.

cpp
#include <Servo.h> #include <SoftwareSerial.h> Servo lockServo; SoftwareSerial bluetooth(10, 11); // RX, TX void setup() { lockServo.attach(9); bluetooth.begin(9600); } void loop() { if (bluetooth.available()) { char command = bluetooth.read(); if (command == 'o') { // Команда открыть lockServo.write(90); // Открываем замок delay(5000); // Держим открытым 5 секунд lockServo.write(0); // Закрываем замок } } }

98. Система управления жалюзи с пультом дистанционного управления

Описание: Устройство, которое управляет жалюзи с помощью IR-пульта.

cpp
#include <Servo.h> #include <IRremote.h> Servo blindsServo; const int recv_pin = 2; IRrecv irrecv(recv_pin); decode_results results; void setup() { blindsServo.attach(9); irrecv.enableIRIn(); } void loop() { if (irrecv.decode(&results)) { if (results.value == 0x1FE48B7) { // Код для открытия blindsServo.write(0); // Открываем } else if (results.value == 0x1FE58A7) { // Код для закрытия blindsServo.write(90); // Закрываем } irrecv.resume(); } }

99. Система учета времени с сервоприводом

Описание: Устройство, которое движет сервоприводом в зависимости от времени.

cpp
#include <Wire.h> #include <RTClib.h> #include <Servo.h> RTC_DS1307 rtc; Servo clockServo; void setup() { rtc.begin(); clockServo.attach(9); } void loop() { DateTime now = rtc.now(); // Пример перемещения сервопривода по часам clockServo.write(map(now.hour(), 0, 23, 0, 180)); // Угол от 0 до 180 delay(60000); // Обновляем каждую минуту }

100. Система автоматизации рабочего места с различными сенсорами

Описание: Устройство, которое включает и выключает свет и вентиляцию в зависимости от присутствия людей и уровня освещенности.

cpp
#include <Servo.h> Servo lightServo; Servo fanServo; const int motionSensorPin = 2; // Датчик движения const int lightSensorPin = A0; // Датчик света void setup() { lightServo.attach(9); fanServo.attach(10); pinMode(motionSensorPin, INPUT); } void loop() { int motionDetected = digitalRead(motionSensorPin); int lightLevel = analogRead(lightSensorPin); if (motionDetected == HIGH && lightLevel < 300) { // Если есть движение и свет низкий lightServo.write(0); // Включаем свет fanServo.write(90); // Включаем вентилятор } else { lightServo.write(90); // Выключаем свет fanServo.write(0); // Выключаем вентилятор } delay(1000); }

1. Мигающий светодиод

Описание: Простой проект, где светодиод мигает с интервалом в одну секунду.

cpp
const int ledPin = 13; // Пин, к которому подключен светодиод void setup() { pinMode(ledPin, OUTPUT); // Устанавливаем пин как выход } void loop() { digitalWrite(ledPin, HIGH); // Включаем светодиод delay(1000); // Ждем 1 секунду digitalWrite(ledPin, LOW); // Выключаем светодиод delay(1000); // Ждем 1 секунду }

2. Считывание значения с потенциометра

Описание: Чтение значения с потенциометра и вывод его на последовательный монитор.

cpp
const int potPin = A0; // Пин, к которому подключен потенциометр void setup() { Serial.begin(9600); // Инициализируем последовательный монитор } void loop() { int potValue = analogRead(potPin); // Чтение значения с потенциометра Serial.println(potValue); // Вывод значения в последовательный монитор delay(500); // Ждем 500 мс }

3. Управление светодиодом с помощью кнопки

Описание: Включение и выключение светодиода по нажатию кнопки.

cpp
const int buttonPin = 2; // Пин, к которому подключена кнопка const int ledPin = 13; // Пин, к которому подключен светодиод int buttonState = 0; // Переменная для хранения состояния кнопки void setup() { pinMode(ledPin, OUTPUT); // Устанавливаем пин как выход pinMode(buttonPin, INPUT); // Устанавливаем пин как вход } void loop() { buttonState = digitalRead(buttonPin); // Чтение состояния кнопки if (buttonState == HIGH) { // Если кнопка нажата digitalWrite(ledPin, HIGH); // Включаем светодиод } else { digitalWrite(ledPin, LOW); // Выключаем светодиод } }

4. Чтение температуры с DS18B20

Описание: Чтение температуры с цифрового термометра DS18B20.

cpp
#include <OneWire.h> #include <DallasTemperature.h> OneWire oneWire(2); // Пин для подключения датчика DallasTemperature sensors(&oneWire); void setup() { Serial.begin(9600); sensors.begin(); // Инициализация датчика } void loop() { sensors.requestTemperatures(); // Запрос температуры Serial.print("Температура: "); Serial.println(sensors.getTempCByIndex(0)); // Вывод температуры в градусах Цельсия delay(1000); }

5. Считывание значений с ультразвукового датчика HC-SR04

Описание: Измерение расстояния с помощью ультразвукового датчика.

cpp
const int trigPin = 9; // Пин для триггера const int echoPin = 10; // Пин для эха void setup() { Serial.begin(9600); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); } void loop() { digitalWrite(trigPin, LOW); // Установка триггера в низкое состояние delayMicroseconds(2); digitalWrite(trigPin, HIGH); // Установка триггера в высокое состояние delayMicroseconds(10); digitalWrite(trigPin, LOW); // Возврат триггера в низкое состояние long duration = pulseIn(echoPin, HIGH); // Измерение продолжительности long distance = duration * 0.034 / 2; // Преобразование в расстояние Serial.print("Расстояние: "); Serial.print(distance); Serial.println(" см"); delay(1000); }

6. Датчик движения PIR

Описание: Включение светодиода при обнаружении движения.

cpp
const int pirPin = 2; // Пин для PIR const int ledPin = 13; // Пин для светодиода void setup() { pinMode(ledPin, OUTPUT); pinMode(pirPin, INPUT); Serial.begin(9600); } void loop() { int pirState = digitalRead(pirPin); // Чтение состояния PIR if (pirState == HIGH) { digitalWrite(ledPin, HIGH); // Включаем светодиод Serial.println("Движение обнаружено!"); } else { digitalWrite(ledPin, LOW); // Выключаем светодиод } }

7. Система сигнализации с пьезоизлучателем

Описание: Извещение при обнаружении движения с помощью пьезоизлучателя.

cpp
const int pirPin = 2; // Пин для PIR const int piezoPin = 9; // Пин для пьезоизлучателя void setup() { pinMode(piezoPin, OUTPUT); pinMode(pirPin, INPUT); Serial.begin(9600); } void loop() { int pirState = digitalRead(pirPin); if (pirState == HIGH) { digitalWrite(piezoPin, HIGH); // Включаем пьезоизлучатель Serial.println("Движение обнаружено!"); delay(1000); // Сигнализация 1 секунда } else { digitalWrite(piezoPin, LOW); // Выключаем пьезоизлучатель } }

8. Управление сервоприводом с помощью потенциометра

Описание: Изменение угла поворота сервопривода в зависимости от положения потенциометра.

cpp
#include <Servo.h> Servo myServo; const int potPin = A0; // Пин для потенциометра void setup() { myServo.attach(9); // Подключаем сервопривод } void loop() { int potValue = analogRead(potPin); // Чтение значения с потенциометра int angle = map(potValue, 0, 1023, 0, 180); // Преобразование в угол myServo.write(angle); // Установка угла delay(15); // Ждем, чтобы сервопривод успел повернуться }

9. Светодиоды в круге

Описание: Мигающий светодиод в круге.

cpp
const int ledCount = 8; // Количество светодиодов int ledPins[] = {2, 3, 4, 5, 6, 7, 8, 9}; // Пины для светодиодов void setup() { for (int i = 0; i < ledCount; i++) { pinMode(ledPins[i], OUTPUT); // Устанавливаем пины как выход } } void loop() { for (int i = 0; i < ledCount; i++) { digitalWrite(ledPins[i], HIGH); // Включаем светодиод delay(100); digitalWrite(ledPins[i], LOW); // Выключаем светодиод } }

10. Считывание значений с датчика света

Описание: Считывание значения с фоторезистора и вывод на последовательный монитор.

cpp
const int lightSensorPin = A0; // Пин для фоторезистора void setup() { Serial.begin(9600); // Инициализация последовательного монитора } void loop() { int lightValue = analogRead(lightSensorPin); // Чтение значения с фоторезистора Serial.print("Значение света: "); Serial.println(lightValue); // Вывод значения на монитор delay(500); // Ждем 500 мс }

11. Считывание значений с датчика влажности и температуры DHT11

Описание: Чтение данных с датчика DHT11.

cpp
#include <DHT.h> #define DHTPIN 2 // Пин, к которому подключен датчик #define DHTTYPE DHT11 // Тип датчика DHT dht(DHTPIN, DHTTYPE); void setup() { Serial.begin(9600); dht.begin(); // Инициализация датчика } void loop() { float h = dht.readHumidity(); // Чтение влажности float t = dht.readTemperature(); // Чтение температуры Serial.print("Влажность: "); Serial.print(h); Serial.print("%, Температура: "); Serial.print(t); Serial.println("°C"); delay(2000); // Ждем 2 секунды }

12. Сигнализация при превышении температуры

Описание: Включение светодиода при превышении заданного порога температуры.

cpp
#include <DHT.h> #define DHTPIN 2 #define DHTTYPE DHT11 #define LEDPIN 13 DHT dht(DHTPIN, DHTTYPE); void setup() { pinMode(LEDPIN, OUTPUT); Serial.begin(9600); dht.begin(); } void loop() { float t = dht.readTemperature(); if (t > 30) { // Если температура больше 30 градусов digitalWrite(LEDPIN, HIGH); // Включаем светодиод } else { digitalWrite(LEDPIN, LOW); // Выключаем светодиод } delay(2000); }

13. Измерение уровня влажности почвы

Описание: Считывание данных с датчика влажности почвы и вывод на монитор.

cpp
const int soilMoisturePin = A0; // Пин для датчика влажности void setup() { Serial.begin(9600); } void loop() { int moistureLevel = analogRead(soilMoisturePin); // Чтение уровня влажности Serial.print("Уровень влажности: "); Serial.println(moistureLevel); delay(1000); }

14. Управление RGB-светодиодом с помощью кнопки

Описание: Изменение цвета RGB-светодиода по нажатию кнопки.

cpp
const int buttonPin = 2; // Пин для кнопки const int redPin = 9; // Пин для красного канала const int greenPin = 10; // Пин для зеленого канала const int bluePin = 11; // Пин для синего канала int colorState = 0; // Переменная для хранения состояния цвета void setup() { pinMode(buttonPin, INPUT); pinMode(redPin, OUTPUT); pinMode(greenPin, OUTPUT); pinMode(bluePin, OUTPUT); } void loop() { if (digitalRead(buttonPin) == HIGH) { colorState++; // Увеличиваем состояние цвета if (colorState > 2) { colorState = 0; // Сброс состояния цвета } switch (colorState) { case 0: // Красный analogWrite(redPin, 255); analogWrite(greenPin, 0); analogWrite(bluePin, 0); break; case 1: // Зеленый analogWrite(redPin, 0); analogWrite(greenPin, 255); analogWrite(bluePin, 0); break; case 2: // Синий analogWrite(redPin, 0); analogWrite(greenPin, 0); analogWrite(bluePin, 255); break; } delay(500); } }

15. Датчик освещенности

Описание: Измерение уровня освещенности и управление светодиодом.

cpp
const int lightSensorPin = A0; // Пин для фоторезистора const int ledPin = 9; // Пин для светодиода void setup() { pinMode(ledPin, OUTPUT); } void loop() { int lightValue = analogRead(lightSensorPin); // Чтение уровня освещенности if (lightValue < 200) { // Если уровень света низкий digitalWrite(ledPin, HIGH); // Включаем светодиод } else { digitalWrite(ledPin, LOW); // Выключаем светодиод } delay(1000); }

16. Термометр с LCD-дисплеем

Описание: Отображение температуры на LCD-дисплее.

cpp
#include <DHT.h> #include <LiquidCrystal.h> #define DHTPIN 2 #define DHTTYPE DHT11 LiquidCrystal lcd(12, 11, 5, 4, 3, 2); DHT dht(DHTPIN, DHTTYPE); void setup() { lcd.begin(16, 2); dht.begin(); } void loop() { float t = dht.readTemperature(); lcd.clear(); lcd.print("Температура:"); lcd.setCursor(0, 1); lcd.print(t); lcd.print(" C"); delay(2000); }

17. Датчик дождя

Описание: Управление светодиодом в зависимости от наличия дождя.

cpp
const int rainSensorPin = A0; // Пин для датчика дождя const int ledPin = 9; // Пин для светодиода void setup() { pinMode(ledPin, OUTPUT); } void loop() { int rainValue = analogRead(rainSensorPin); // Чтение значения с датчика if (rainValue < 500) { // Если дождь digitalWrite(ledPin, HIGH); // Включаем светодиод } else { digitalWrite(ledPin, LOW); // Выключаем светодиод } delay(1000); }

18. Считывание значений с MPU6050 (акселерометр и гироскоп)

Описание: Чтение данных с MPU6050 и вывод их на последовательный монитор.

cpp
#include <Wire.h> #include <MPU6050.h> MPU6050 mpu; void setup() { Serial.begin(9600); Wire.begin(); mpu.initialize(); } void loop() { int16_t ax, ay, az; mpu.getAcceleration(&ax, &ay, &az); // Чтение данных акселерометра Serial.print("ax: "); Serial.print(ax); Serial.print(" ay: "); Serial.print(ay); Serial.print(" az: "); Serial.println(az); delay(500); }

19. Светодиодное шоу

Описание: Создание простого светодиодного шоу.

cpp
const int ledCount = 3; // Количество светодиодов int ledPins[] = {9, 10, 11}; // Пины для светодиодов void setup() { for (int i = 0; i < ledCount; i++) { pinMode(ledPins[i], OUTPUT); } } void loop() { for (int i = 0; i < ledCount; i++) { digitalWrite(ledPins[i], HIGH); // Включаем светодиод delay(200); digitalWrite(ledPins[i], LOW); // Выключаем светодиод } }

20. Считывание данных с GPS

Описание: Считывание данных с GPS модуля.

cpp
#include <TinyGPS++.h> #include <HardwareSerial.h> TinyGPSPlus gps; HardwareSerial serialGPS(1); // Используем Serial1 для GPS void setup() { Serial.begin(9600); serialGPS.begin(9600); // Инициализация GPS } void loop() { while (serialGPS.available()) { gps.encode(serialGPS.read()); // Чтение данных GPS if (gps.location.isUpdated()) { Serial.print("Широта: "); Serial.print(gps.location.lat(), 6); Serial.print(", Долгота: "); Serial.println(gps.location.lng(), 6); } } }

21. Автоматизация полива растений

Описание: Автоматический полив растений с использованием датчика влажности.

cpp
const int soilMoisturePin = A0; // Пин для датчика влажности const int pumpPin = 9; // Пин для управления насосом void setup() { pinMode(pumpPin, OUTPUT); } void loop() { int moistureLevel = analogRead(soilMoisturePin); if (moistureLevel < 300) { // Если уровень влажности низкий digitalWrite(pumpPin, HIGH); // Включаем насос delay(5000); // Полив 5 секунд digitalWrite(pumpPin, LOW); // Выключаем насос } delay(10000); // Ждем 10 секунд перед следующей проверкой }

22. Измерение пульса с MAX30100

Описание: Измерение пульса с помощью датчика MAX30100.

cpp
#include <Wire.h> #include "MAX30100_PulseOximeter.h" MAX30100_PulseOximeter pox; void setup() { Serial.begin(9600); pox.begin(); } void loop() { pox.update(); // Обновление данных Serial.print("Пульс: "); Serial.print(pox.getHeartRate()); Serial.println(" bpm"); delay(1000); }

23. Кнопка с двумя светодиодами

Описание: Включение одного светодиода при нажатии кнопки и другого при отпускании.

cpp
const int buttonPin = 2; // Пин для кнопки const int ledOnPin = 9; // Пин для светодиода "включено" const int ledOffPin = 10; // Пин для светодиода "выключено" void setup() { pinMode(buttonPin, INPUT); pinMode(ledOnPin, OUTPUT); pinMode(ledOffPin, OUTPUT); } void loop() { if (digitalRead(buttonPin) == HIGH) { digitalWrite(ledOnPin, HIGH); // Включаем светодиод "включено" digitalWrite(ledOffPin, LOW); // Выключаем светодиод "выключено" } else { digitalWrite(ledOnPin, LOW); digitalWrite(ledOffPin, HIGH); // Включаем светодиод "выключено" } }

24. Кнопка с подсветкой

Описание: Подсветка кнопки при нажатии.

cpp
const int buttonPin = 2; // Пин для кнопки const int ledPin = 9; // Пин для подсветки void setup() { pinMode(buttonPin, INPUT); pinMode(ledPin, OUTPUT); } void loop() { if (digitalRead(buttonPin) == HIGH) { digitalWrite(ledPin, HIGH); // Включаем подсветку } else { digitalWrite(ledPin, LOW); // Выключаем подсветку } }

25. Светофор

Описание: Имитация работы светофора.

cpp
const int redPin = 9; // Пин для красного света const int yellowPin = 10; // Пин для желтого света const int greenPin = 11; // Пин для зеленого света void setup() { pinMode(redPin, OUTPUT); pinMode(yellowPin, OUTPUT); pinMode(greenPin, OUTPUT); } void loop() { digitalWrite(redPin, HIGH); // Красный delay(5000); digitalWrite(redPin, LOW); digitalWrite(greenPin, HIGH); // Зеленый delay(5000); digitalWrite(greenPin, LOW); digitalWrite(yellowPin, HIGH); // Желтый delay(2000); digitalWrite(yellowPin, LOW); }

26. Сенсорный переключатель

Описание: Управление светодиодом с помощью сенсорного переключателя.

cpp
const int touchPin = 2; // Пин для сенсора const int ledPin = 9; // Пин для светодиода void setup() { pinMode(touchPin, INPUT); pinMode(ledPin, OUTPUT); } void loop() { if (digitalRead(touchPin) == HIGH) { digitalWrite(ledPin, HIGH); // Включаем светодиод } else { digitalWrite(ledPin, LOW); // Выключаем светодиод } }

27. Индикатор уровня воды

Описание: Управление светодиодами в зависимости от уровня воды.

cpp
const int waterLevelPin = A0; // Пин для датчика уровня воды const int ledLowPin = 9; // Светодиод для низкого уровня const int ledHighPin = 10; // Светодиод для высокого уровня void setup() { pinMode(ledLowPin, OUTPUT); pinMode(ledHighPin, OUTPUT); } void loop() { int waterLevel = analogRead(waterLevelPin); if (waterLevel < 300) { // Низкий уровень digitalWrite(ledLowPin, HIGH); digitalWrite(ledHighPin, LOW); } else { digitalWrite(ledLowPin, LOW); digitalWrite(ledHighPin, HIGH); // Высокий уровень } }

28. Звуковая сигнализация

Описание: Извещение с помощью пьезоизлучателя при нажатии кнопки.

cpp
const int buttonPin = 2; // Пин для кнопки const int piezoPin = 9; // Пин для пьезоизлучателя void setup() { pinMode(buttonPin, INPUT); pinMode(piezoPin, OUTPUT); } void loop() { if (digitalRead(buttonPin) == HIGH) { tone(piezoPin, 1000); // Включаем звук } else { noTone(piezoPin); // Выключаем звук } }

29. Светодиодная матрица

Описание: Управление светодиодной матрицей.

cpp
#include <Adafruit_GFX.h> #include <Adafruit_LEDBackpack.h> Adafruit_BicolorMatrix matrix = Adafruit_BicolorMatrix(); void setup() { matrix.begin(0x70); // Адрес I2C } void loop() { matrix.drawPixel(0, 0, LED_RED); // Включаем красный светодиод matrix.writeDisplay(); delay(500); matrix.clear(); // Выключаем светодиоды matrix.writeDisplay(); delay(500); }

30. Сенсор дистанции с HC-SR04

Описание: Измерение расстояния с помощью ультразвукового датчика и отображение значения на OLED-дисплее.

cpp
#include <Wire.h> #include <Adafruit_SSD1306.h> #define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 64 #define OLED_RESET -1 Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); const int trigPin = 9; const int echoPin = 10; void setup() { Serial.begin(9600); display.begin(SSD1306_I2C_ADDRESS, OLED_RESET); display.clearDisplay(); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); } void loop() { digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); long duration = pulseIn(echoPin, HIGH); long distance = duration * 0.034 / 2; display.clearDisplay(); display.setCursor(0, 0); display.print("Расстояние: "); display.print(distance); display.print(" см"); display.display(); delay(1000); }

31. Система безопасности с RFID

Описание: Чтение метки RFID и управление светодиодом.

cpp
#include <SPI.h> #include <MFRC522.h> #define SS_PIN 10 #define RST_PIN 9 MFRC522 mfrc522(SS_PIN, RST_PIN); void setup() { Serial.begin(9600); SPI.begin(); mfrc522.PCD_Init(); } void loop() { if (!mfrc522.PICC_IsNewCardPresent()) return; if (!mfrc522.PICC_ReadCardSerial()) return; Serial.print("UID:"); for (byte i = 0; i < mfrc522.uid.size; i++) { Serial.print(mfrc522.uid.uidByte[i], DEC); Serial.print(" "); } Serial.println(); mfrc522.PICC_HaltA(); }

32. Индикатор температуры и влажности на LCD

Описание: Отображение температуры и влажности на LCD-дисплее.

cpp
#include <LiquidCrystal.h> #include <DHT.h> #define DHTPIN 2 #define DHTTYPE DHT11 LiquidCrystal lcd(12, 11, 5, 4, 3, 2); DHT dht(DHTPIN, DHTTYPE); void setup() { lcd.begin(16, 2); dht.begin(); } void loop() { float h = dht.readHumidity(); float t = dht.readTemperature(); lcd.clear(); lcd.print("Temp:"); lcd.print(t); lcd.print("C"); lcd.setCursor(0, 1); lcd.print("Humidity:"); lcd.print(h); lcd.print("%"); delay(2000); }

33. Светодиодный индикатор уровня влажности

Описание: Управление светодиодами в зависимости от уровня влажности.

cpp
const int moisturePin = A0; const int ledLowPin = 9; const int ledHighPin = 10; void setup() { pinMode(ledLowPin, OUTPUT); pinMode(ledHighPin, OUTPUT); } void loop() { int moistureValue = analogRead(moisturePin); if (moistureValue < 300) { digitalWrite(ledLowPin, HIGH); digitalWrite(ledHighPin, LOW); } else { digitalWrite(ledLowPin, LOW); digitalWrite(ledHighPin, HIGH); } delay(1000); }

34. Вентилятор с датчиком температуры

Описание: Управление вентилятором в зависимости от температуры.

cpp
#include <DHT.h> #define DHTPIN 2 #define DHTTYPE DHT11 const int fanPin = 9; DHT dht(DHTPIN, DHTTYPE); void setup() { pinMode(fanPin, OUTPUT); dht.begin(); } void loop() { float t = dht.readTemperature(); if (t > 25) { digitalWrite(fanPin, HIGH); // Включаем вентилятор } else { digitalWrite(fanPin, LOW); // Выключаем вентилятор } delay(2000); }

35. Контроль за уровнем освещенности

Описание: Управление светодиодом в зависимости от уровня освещенности.

cpp
const int lightSensorPin = A0; const int ledPin = 9; void setup() { pinMode(ledPin, OUTPUT); } void loop() { int lightValue = analogRead(lightSensorPin); if (lightValue < 200) { digitalWrite(ledPin, HIGH); // Включаем светодиод } else { digitalWrite(ledPin, LOW); // Выключаем светодиод } delay(1000); }

36. Измерение частоты пульса

Описание: Измерение частоты пульса с помощью фотодатчика.

cpp
#include <PulseOximeter.h> PulseOximeter pox; void setup() { Serial.begin(9600); pox.begin(); } void loop() { pox.update(); Serial.print("Пульс: "); Serial.println(pox.getHeartRate()); delay(1000); }

37. Интерфейс управления

Описание: Простой интерфейс для управления устройством.

cpp
const int buttonPin = 2; const int ledPin = 9; void setup() { pinMode(buttonPin, INPUT); pinMode(ledPin, OUTPUT); } void loop() { if (digitalRead(buttonPin) == HIGH) { digitalWrite(ledPin, HIGH); // Включаем светодиод } else { digitalWrite(ledPin, LOW); // Выключаем светодиод } }

38. Управление сервомотором

Описание: Управление сервомотором с помощью кнопки.

cpp
#include <Servo.h> const int buttonPin = 2; const int servoPin = 9; Servo myServo; void setup() { myServo.attach(servoPin); pinMode(buttonPin, INPUT); } void loop() { if (digitalRead(buttonPin) == HIGH) { myServo.write(90); // Угол 90 градусов } else { myServo.write(0); // Угол 0 градусов } }

39. Автоматизация освещения

Описание: Управление освещением в зависимости от уровня освещенности.

cpp
const int lightSensorPin = A0; const int ledPin = 9; void setup() { pinMode(ledPin, OUTPUT); } void loop() { int lightValue = analogRead(lightSensorPin); if (lightValue < 200) { digitalWrite(ledPin, HIGH); // Включаем светодиод } else { digitalWrite(ledPin, LOW); // Выключаем светодиод } delay(1000); }

40. Водяной насос с датчиком уровня воды

Описание: Управление насосом в зависимости от уровня воды.

cpp
const int waterLevelPin = A0; const int pumpPin = 9; void setup() { pinMode(pumpPin, OUTPUT); } void loop() { int waterLevel = analogRead(waterLevelPin); if (waterLevel < 300) { digitalWrite(pumpPin, HIGH); // Включаем насос } else { digitalWrite(pumpPin, LOW); // Выключаем насос } delay(1000); }

ChatGPT

20 ИДЕЙ ДЛЯ ИГР НА ARDUINO

1. Световой сигнал

Описание: Игрок должен нажать кнопку, когда светодиод загорится.

cpp
const int buttonPin = 2; const int ledPin = 9; void setup() { pinMode(buttonPin, INPUT); pinMode(ledPin, OUTPUT); randomSeed(analogRead(0)); } void loop() { digitalWrite(ledPin, HIGH); delay(random(500, 3000)); // Задержка от 0.5 до 3 секунд digitalWrite(ledPin, LOW); unsigned long startTime = millis(); while (millis() - startTime < 2000) { // Игрок имеет 2 секунды if (digitalRead(buttonPin) == HIGH) { Serial.println("Вы нажали вовремя!"); return; } } Serial.println("Слишком поздно!"); }

2. Игра с кнопками

Описание: Игрок должен нажать кнопку в правильном порядке.

cpp
const int buttonPin = 2; const int ledPin1 = 9; const int ledPin2 = 10; const int ledPin3 = 11; int sequence[3] = {1, 2, 3}; // Последовательность int userInput[3]; void setup() { pinMode(buttonPin, INPUT); pinMode(ledPin1, OUTPUT); pinMode(ledPin2, OUTPUT); pinMode(ledPin3, OUTPUT); randomSeed(analogRead(0)); } void loop() { for (int i = 0; i < 3; i++) { int led = random(1, 4); digitalWrite(led + 8, HIGH); delay(1000); digitalWrite(led + 8, LOW); delay(500); } // Сбор ввода от пользователя for (int i = 0; i < 3; i++) { while (true) { if (digitalRead(buttonPin) == HIGH) { userInput[i] = i + 1; break; } } } // Проверка последовательности for (int i = 0; i < 3; i++) { if (userInput[i] != sequence[i]) { Serial.println("Неправильная последовательность!"); return; } } Serial.println("Правильно!"); }

3. Игра в угадай число

Описание: Arduino генерирует случайное число, игрок должен угадать его.

cpp
int randomNumber; const int buttonPin = 2; void setup() { Serial.begin(9600); pinMode(buttonPin, INPUT); randomSeed(analogRead(0)); randomNumber = random(1, 101); // Генерация числа от 1 до 100 } void loop() { Serial.println("Угадайте число от 1 до 100:"); while (true) { if (digitalRead(buttonPin) == HIGH) { int guess = random(1, 101); // Получение случайного предположения Serial.print("Ваше предположение: "); Serial.println(guess); if (guess == randomNumber) { Serial.println("Вы угадали!"); break; } else if (guess < randomNumber) { Serial.println("Слишком маленькое число!"); } else { Serial.println("Слишком большое число!"); } } } }

4. Змейка

Описание: Простая версия игры "Змейка" с использованием матрицы светодиодов.

cpp
#include <Adafruit_GFX.h> #include <Adafruit_LEDBackpack.h> Adafruit_BicolorMatrix matrix = Adafruit_BicolorMatrix(); int snakeX[10] = {0, 0, 0}; int snakeY[10] = {0, 1, 2}; int foodX, foodY; void setup() { matrix.begin(0x70); placeFood(); } void loop() { // Управление и логика игры matrix.clear(); for (int i = 0; i < 3; i++) { matrix.drawPixel(snakeX[i], snakeY[i], LED_GREEN); } matrix.drawPixel(foodX, foodY, LED_RED); matrix.writeDisplay(); delay(500); } void placeFood() { foodX = random(0, 8); foodY = random(0, 8); }

5. Угадай мелодию

Описание: Arduino воспроизводит мелодию, игрок должен угадать ноту.

cpp
#include <Tone.h> const int buttonPin = 2; Tone tone1; void setup() { pinMode(buttonPin, INPUT); Serial.begin(9600); } void loop() { int note = random(261, 523); // Генерация случайной ноты tone1.begin(9); tone1.play(note); delay(2000); tone1.stop(); // Ожидание ввода while (true) { if (digitalRead(buttonPin) == HIGH) { Serial.print("Вы угадали ноту: "); Serial.println(note); break; } } }

6. Реакция

Описание: Игрок должен нажать кнопку как можно быстрее после включения светодиода.

cpp
const int buttonPin = 2; const int ledPin = 9; void setup() { pinMode(buttonPin, INPUT); pinMode(ledPin, OUTPUT); randomSeed(analogRead(0)); } void loop() { digitalWrite(ledPin, HIGH); unsigned long startTime = millis(); delay(random(2000, 5000)); // Задержка от 2 до 5 секунд digitalWrite(ledPin, LOW); while (digitalRead(buttonPin) == LOW); // Ожидание нажатия unsigned long reactionTime = millis() - startTime; Serial.print("Ваше время реакции: "); Serial.print(reactionTime); Serial.println(" мс"); }

7. Ловкость рук

Описание: Игрок должен нажимать кнопку, когда светодиод загорится, но не когда он выключится.

cpp
const int buttonPin = 2; const int ledPin = 9; void setup() { pinMode(buttonPin, INPUT); pinMode(ledPin, OUTPUT); randomSeed(analogRead(0)); } void loop() { digitalWrite(ledPin, HIGH); delay(random(1000, 5000)); // Задержка от 1 до 5 секунд digitalWrite(ledPin, LOW); // Ожидание нажатия кнопки if (digitalRead(buttonPin) == HIGH) { Serial.println("Вы нажали слишком рано!"); } delay(2000); }

8. Игра на память

Описание: Arduino зажигает последовательность светодиодов, игрок должен повторить.

cpp
#include <Adafruit_GFX.h> #include <Adafruit_LEDBackpack.h> Adafruit_BicolorMatrix matrix = Adafruit_BicolorMatrix(); int sequence[10]; int length = 0; void setup() { matrix.begin(0x70); randomSeed(analogRead(0)); } void loop() { // Генерация новой последовательности length++; sequence[length - 1] = random(0, 8); // Показать последовательность for (int i = 0; i < length; i++) { matrix.clear(); matrix.drawPixel(sequence[i], 0, LED_GREEN); matrix.writeDisplay(); delay(1000); } // Ожидание ввода игрока for (int i = 0; i < length; i++) { // Ввод игрока здесь } matrix.clear(); }

9. Гонки

Описание: Игрок должен нажимать кнопку, чтобы "двигаться вперед".

cpp
const int buttonPin = 2; int position = 0; void setup() { Serial.begin(9600); pinMode(buttonPin, INPUT); } void loop() { if (digitalRead(buttonPin) == HIGH) { position++; Serial.print("Вы находитесь на позиции: "); Serial.println(position); delay(1000); // Задержка перед следующим ходом } }

10. Точки на матрице

Описание: Игрок должен нажимать на кнопки, когда точка загорается.

cpp
#include <Adafruit_GFX.h> #include <Adafruit_LEDBackpack.h> Adafruit_BicolorMatrix matrix = Adafruit_BicolorMatrix(); const int buttonPin1 = 2; const int buttonPin2 = 3; int currentLed; void setup() { matrix.begin(0x70); pinMode(buttonPin1, INPUT); pinMode(buttonPin2, INPUT); randomSeed(analogRead(0)); } void loop() { currentLed = random(0, 8); matrix.clear(); matrix.drawPixel(currentLed, 0, LED_GREEN); matrix.writeDisplay(); // Ожидание нажатия кнопки while (true) { if (digitalRead(buttonPin1) == HIGH || digitalRead(buttonPin2) == HIGH) { if (digitalRead(buttonPin1) == HIGH) { Serial.println("Кнопка 1 нажата!"); } if (digitalRead(buttonPin2) == HIGH) { Serial.println("Кнопка 2 нажата!"); } break; } } delay(2000); }

11. Цифровой дартс

Описание: Игрок должен нажать кнопку, чтобы "попасть в цель".

cpp
const int buttonPin = 2; int score = 0; void setup() { Serial.begin(9600); pinMode(buttonPin, INPUT); } void loop() { if (digitalRead(buttonPin) == HIGH) { score++; Serial.print("Ваш счет: "); Serial.println(score); delay(1000); } }

12. Светодиодный бегунок

Описание: Игрок должен нажимать кнопку, чтобы перемещать светодиод по матрице.

cpp
#include <Adafruit_GFX.h> #include <Adafruit_LEDBackpack.h> Adafruit_BicolorMatrix matrix = Adafruit_BicolorMatrix(); const int buttonPin = 2; int position = 0; void setup() { matrix.begin(0x70); pinMode(buttonPin, INPUT); } void loop() { matrix.clear(); matrix.drawPixel(position, 0, LED_GREEN); matrix.writeDisplay(); if (digitalRead(buttonPin) == HIGH) { position++; if (position > 7) position = 0; // Зацикливаем delay(500); } delay(100); }

13. Игра на реакцию с таймером

Описание: Игрок должен нажать кнопку до того, как таймер закончится.

cpp
const int buttonPin = 2; unsigned long startTime; void setup() { Serial.begin(9600); pinMode(buttonPin, INPUT); } void loop() { delay(random(2000, 5000)); startTime = millis(); while (millis() - startTime < 3000) { // 3 секунды нажатия if (digitalRead(buttonPin) == HIGH) { Serial.println("Вы нажали вовремя!"); return; } } Serial.println("Вы не успели!"); }

14. Игра на внимание

Описание: Игрок должен нажать кнопку в случайный момент времени.

cpp
const int buttonPin = 2; unsigned long waitTime; void setup() { Serial.begin(9600); pinMode(buttonPin, INPUT); randomSeed(analogRead(0)); } void loop() { waitTime = random(2000, 5000); delay(waitTime); Serial.println("Нажмите кнопку!"); while (true) { if (digitalRead(buttonPin) == HIGH) { Serial.print("Вы нажали через "); Serial.print(waitTime); Serial.println(" мс!"); break; } } }

15. Прыгающий шарик

Описание: Игрок должен удерживать кнопку, чтобы "прыгнуть".

cpp
const int buttonPin = 2; int position = 0; void setup() { Serial.begin(9600); pinMode(buttonPin, INPUT); } void loop() { if (digitalRead(buttonPin) == HIGH) { position++; Serial.print("Шарик на высоте: "); Serial.println(position); delay(1000); // Время прыжка } }

16. Светодиодная пирамида

Описание: Игрок должен набирать очки, зажигая светодиоды.

cpp
#include <Adafruit_GFX.h> #include <Adafruit_LEDBackpack.h> Adafruit_BicolorMatrix matrix = Adafruit_BicolorMatrix(); const int buttonPin = 2; int score = 0; void setup() { matrix.begin(0x70); pinMode(buttonPin, INPUT); } void loop() { matrix.clear(); for (int i = 0; i < score; i++) { matrix.drawPixel(i, 0, LED_GREEN); } matrix.writeDisplay(); if (digitalRead(buttonPin) == HIGH) { score++; if (score > 7) score = 0; // Зацикливаем delay(1000); } }

17. Игра на внимательность

Описание: Игрок должен нажимать кнопку, когда светодиод загорается.

cpp
const int buttonPin = 2; const int ledPin = 9; void setup() { pinMode(buttonPin, INPUT); pinMode(ledPin, OUTPUT); randomSeed(analogRead(0)); } void loop() { delay(random(2000, 5000)); digitalWrite(ledPin, HIGH); unsigned long startTime = millis(); while (true) { if (digitalRead(buttonPin) == HIGH) { unsigned long reactionTime = millis() - startTime; Serial.print("Ваше время реакции: "); Serial.println(reactionTime); digitalWrite(ledPin, LOW); delay(2000); break; } } digitalWrite(ledPin, LOW); }

18. Светофор

Описание: Игрок должен реагировать на изменение цвета светофора.

cpp
const int buttonPin = 2; const int redPin = 9; const int yellowPin = 10; const int greenPin = 11; void setup() { pinMode(buttonPin, INPUT); pinMode(redPin, OUTPUT); pinMode(yellowPin, OUTPUT); pinMode(greenPin, OUTPUT); } void loop() { // Красный digitalWrite(redPin, HIGH); delay(3000); digitalWrite(redPin, LOW); // Желтый digitalWrite(yellowPin, HIGH); delay(1000); digitalWrite(yellowPin, LOW); // Зеленый digitalWrite(greenPin, HIGH); delay(3000); digitalWrite(greenPin, LOW); }

19. Лабиринт

Описание: Игрок должен пройти лабиринт, нажимая кнопку.

cpp
const int buttonPin = 2; int position = 0; void setup() { Serial.begin(9600); pinMode(buttonPin, INPUT); } void loop() { if (digitalRead(buttonPin) == HIGH) { position++; Serial.print("Вы находитесь на позиции: "); Serial.println(position); delay(1000); } }

20. Угонщик машин

Описание: Игрок должен реагировать на случайные появления "машин".

cpp
const int buttonPin = 2; void setup() { Serial.begin(9600); pinMode(buttonPin, INPUT); } void loop() { delay(random(1000, 5000)); Serial.println("Машина появилась! Нажмите кнопку!"); while (true) { if (digitalRead(buttonPin) == HIGH) { Serial.println("Вы угнали машину!"); break; } } }